簡體   English   中英

python多線程,隊列按順序運行,而不是並行運行

[英]python multithreading with queue running in sequence not in parallel

為什么此代碼不是並行運行,所以需要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

這個作品!

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)

答案就在這里:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM