多进程比单进程更慢地让工人出队

Getting workers out of queue slower with multiple processes than single process

所以我有以下代码

import time
from multiprocessing import Process
from multiprocessing import JoinableQueue as Queue

def checker(q):
    while True:
        data = q.get()
        if data is None:
            return

if __name__ == '__main__':
    t = time.time()
    q = Queue()

    for i in range(500000):
        q.put(i)
    procs = []
    for _ in range(4):
        q.put(None)
        p = Process(target=checker, args=(q,), daemon=True)
        # p = Thread(target=checker, args=(q,))
        p.start()
        procs.append(p)

    for p in procs:
        p.join()

    print(time.time() - t)

当我 运行 这个程序有 4 个并行进程时,它需要大约 4.14 秒才能完成,而当它 运行 只有一个进程时,它需要大约 4.14 秒=12=]秒。

多个线程 运行 同时发生同样的事情。

我对这种行为的可能解释是,由于 queuesmultithreadingmultiprocessing 安全的并且具有内置的互斥实现,所以只有一个 threadprocess 可以一次访问队列。

因此,对于单个 process/thread,python 解释器或 CPU 无需抢占,以确保每个 thread/process 都有平等机会 运行 他们的代码,但是多次 processes/threads 这种抢占的成本增加了程序的总 运行 时间。

所以我正在考虑正确的路线,还是因为其他原因而发生这种情况。

这并不奇怪。你什么都没做。因此,您要测量的是生成多个进程、设置进程间通信以及通过这些通道编组和解组数据的开销。这太贵了。

但是尝试在检查器中进行一些实际计算,table 会快速翻转。