Ответ лежит здесь:
for message_nbr in range(40):
q.put(f())
Вы помещаете 40 экземпляров None в свою очередь, потому что вы вызываете f()
, который возвращает None вместо передачи f
(объект функции) в. Этот блок требует 20 секунд для запуска!
Изменение этого кода
def do_stuff(q):
while True:
output = q.get()
q.task_done()
на этот
def do_stuff(q):
while True:
output = q.get()
output()
q.task_done()
также необходимо (необходимовызовите функцию!)
Финал:
import time
from queue import Queue
from threading import Thread
start = time.time()
def f():
time.sleep(0.5)
print("yes")
return 'yes'
def do_stuff(q):
while True:
output = q.get()
output()
q.task_done()
q = Queue(maxsize=100)
for message_nbr in range(40):
q.put(f)
num_threads = 10
for i in range(num_threads):
worker = Thread(target=do_stuff, args=(q, ))
worker.setDaemon(True)
worker.start()
q.join()
print("time: ", time.time() - start) # time: 2.183439254760742