所以我有以下代码
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
秒。
多个线程同时运行会发生同样的事情。
我对此行为的可能解释是,由于queues
是multithreading
和multiprocessing
安全且具有内置互斥量实现,因此只有一个thread
或{{1} }可以一次访问队列。
因此,对于单个进程/线程,process
解释器或CPU不会进行抢占,以确保每个线程/进程都有平等的机会运行其代码,但是多个进程/线程的代价是抢占方式会增加程序的整体运行时间。
所以我正在考虑正确的路线,或者这是由于其他原因导致的。
答案 0 :(得分:1)
这并不奇怪。你什么也没做。因此,您要测量的是产生多个进程,建立进程间通信以及在这些通道上封送和拆封数据的开销。这太贵了。
但是尝试在Checker中进行一些实际计算,该表将快速翻转。