Как остановить создание новых тредов, если они находятся в цикле?

Необходимо в цикле вызывать создание тредов, но не нужно создавать их каждое прохождение цикла. Я пробовал добавлять условие, что если тредов больше 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()))
→ Ссылка