многопоточность Python с очередью, запущенной последовательно, а не параллельно - PullRequest
0 голосов
/ 23 октября 2018

почему этот код не работает параллельно, его запуск занимает 20 секунд, что означает, что он выполняется последовательно.Спасибо за помощь.

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()
        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)  # ~20 seconds

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Ответ лежит здесь:

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
0 голосов
/ 23 октября 2018

это работает!

start = time.time()
def f(m):
    time.sleep(0.5)
    print("yes")
    return 'yes'


def do_stuff(q):
    while True:
        output = q.get()
        final_result = f(output)
        q.task_done()


q = Queue(maxsize=0)
for message_nbr in range(10):
#     q.put(f())
    q.put(message_nbr)

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...