1

我有这段代码,并注意到在指定超过 1 个线程时,性能会受到影响。这里的概念很简单,在多处理中设置一个队列,从每个线程访问它,同样——注意我在这里使用了一个容易分割的队列大小。

import time
from  multiprocessing import Process, Queue

def worker(q,x):
    for i in range(x):
        message = q.get()


if __name__ == "__main__":

    workers=[]
    threads=1
    x = int(1000000/threads) #break up the work for each thread
    q = Queue()

    for i in range(threads):
        p=Process(target=worker, args=(q,x))
        workers.append(p)


    print('creating queue')
    for num in range(1000000):
        q.put("MESSAGE")

    start_time = time.time()

    print('starting jobs')
    for p in workers:
        p.start()

    print('waiting until jobs finish')
    for p in workers:
        p.join()

    end_time = time.time()

    duration = end_time - start_time
    msg_per_sec = 1000000 / duration

    print ("Duration: %s" % duration)
    print ("Messages Per Second: %s" % msg_per_sec)

我用执行 urllib 请求的多处理线程制作了一个不同的脚本,它表明缩放处理器有助于加快速度,所以我在这里做错了什么;是不是我正在从所有进程访问队列并且本质上是阻塞的?

4

1 回答 1

3

问题是你的工人没有做任何有用的工作。所有的时间都花在从队列中取出东西上。队列是共享的,对它的所有访问都是序列化的,因此没有加速。

一旦工作人员开始花费一些 CPU 或 I/O 时间来处理每条消息,事情就会开始改善。

参见阿姆达尔定律

于 2013-01-03T18:55:45.097 回答