Как во время выполнения цикла изменить target для threading

Есть следующий пример:

import threading
from queue import Queue


def myfunc():
    while True:
        num = queue.get()
        print(num / 10)
        queue.task_done()

def myfunc2():
    while True:
        num = queue.get()
        print(num * 10)
        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)
    for i in mylist:
        queue.put(i)
    queue.join()

Как, в данном случае, во время выполнения цикла, изменить target для тредов на myfunc2?


Ответы (2 шт):

Автор решения: n1tr0xs

Думаю, этот код вам поможет. Его следует использовать вместо вашего цикла for t in range(3)

func=myfunc
for i in range(3):
    if i==3:
        func=myfunc2
    t = threading.Thread(target=func)
    t.setDaemon(True)
    t.start()
→ Ссылка
Автор решения: Lecron

Как и в прошлом вопросе, предлагаю использовать пул потоков, а не создавать его самому.

import time
import threading
from concurrent.futures.thread import ThreadPoolExecutor

DELAY = 2
COUNT_THREAD = 3

def myfunc(value):
    time.sleep(DELAY)
    print(value, value / 10, threading.current_thread().name)

def myfunc2(value):
    time.sleep(DELAY)
    print(value, value * 10, threading.current_thread().name)


executor = ThreadPoolExecutor(COUNT_THREAD)
for x in range(10):
    for f in (myfunc, myfunc2):
        executor.submit(f, x)
→ Ссылка