Как остановить создание новых тредов, если они находятся в цикле?
Необходимо в цикле вызывать создание тредов, но не нужно создавать их каждое прохождение цикла. Я пробовал добавлять условие, что если тредов больше n, то не надо создавать новые, но это останавливает цикл, также нельзя иметь более одного t.start(). Набросал вот такой пример:
import threading
from queue import Queue
def myfunc():
while True:
num = queue.get()
print(num)
queue.task_done()
mylist = []
for x in range(10):
for i in range(10):
for i in range (10):
mylist.append(i / 10)
queue = Queue()
for t in range(3):
t = threading.Thread(target=myfunc)
t.setDaemon(True)
t.start()
for i in mylist:
queue.put(i)
queue.join()
print(len(threading.enumerate()))
В итогде получается 31 тред, как сделать так, чтобы они создавались единожды и при этом продолжали работу с циклом?
Ответы (2 шт):
Автор решения: Lecron
→ Ссылка
Возможно я неверно понял условие задачи, но думаю надо смотреть в эту сторону
from concurrent.futures.thread import ThreadPoolExecutor
COUNT_THREAD = 2
mylist = [1, 2, 3]
def func(value):
print(value)
with ThreadPoolExecutor(COUNT_THREAD) as executor:
m = executor.map(func, mylist)
Автор решения: Brain Drill
→ Ссылка
Благодаря комментарию 0andriy нашел ответ.
import threading
from queue import Queue
def myfunc():
while True:
num = queue.get()
print(num)
queue.task_done()
queue = Queue()
for t in range(3):
t = threading.Thread(target=myfunc)
t.setDaemon(True)
t.start()
mylist = []
for x in range(10):
for i in range(10):
for i in range (10):
mylist.append(i / 10)
for i in mylist:
queue.put(i)
queue.join()
print(len(threading.enumerate()))