Py学习  »  Python

队列按顺序非并行运行的python多线程处理

Amir Sadr • 4 年前 • 368 次点击  

为什么这段代码没有并行运行,运行它需要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
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39821
 
368 次点击  
文章 [ 2 ]  |  最新文章 4 年前
Amir Sadr
Reply   •   1 楼
Amir Sadr    5 年前

这个管用!

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)
Mars
Reply   •   2 楼
Mars    5 年前

答案就在这里:

for message_nbr in range(40):
    q.put(f())

您正在将40个None实例放入队列,因为您正在调用 f() 它不返回而不是传递 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