多个进程比单个进程使工作人员离开队列的速度更慢

时间:2019-02-05 08:08:56

标签: python multithreading multiprocessing python-multiprocessing python-multithreading

所以我有以下代码

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秒才能完成,而仅用单个进程运行,则大约需要3.7秒。

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

我对此行为的可能解释是,由于queuesmultithreadingmultiprocessing安全且具有内置互斥量实现,因此只有一个thread或{{1} }可以一次访问队列。

因此,对于单个进程/线程,process解释器或CPU不会进行抢占,以确保每个线程/进程都有平等的机会运行其代码,但是多个进程/线程的代价是抢占方式会增加程序的整体运行时间。

所以我正在考虑正确的路线,或者这是由于其他原因导致的。

1 个答案:

答案 0 :(得分:1)

这并不奇怪。你什么也没做。因此,您要测量的是产生多个进程,建立进程间通信以及在这些通道上封送和拆封数据的开销。这太贵了。

但是尝试在Checker中进行一些实际计算,该表将快速翻转。