多进程比单进程更慢地让工人出队
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=]秒。
多个线程 运行 同时发生同样的事情。
我对这种行为的可能解释是,由于 queues
是 multithreading
和 multiprocessing
安全的并且具有内置的互斥实现,所以只有一个 thread
或 process
可以一次访问队列。
因此,对于单个 process/thread,python
解释器或 CPU 无需抢占,以确保每个 thread/process 都有平等机会 运行 他们的代码,但是多次 processes/threads 这种抢占的成本增加了程序的总 运行 时间。
所以我正在考虑正确的路线,还是因为其他原因而发生这种情况。
这并不奇怪。你什么都没做。因此,您要测量的是生成多个进程、设置进程间通信以及通过这些通道编组和解组数据的开销。这太贵了。
但是尝试在检查器中进行一些实际计算,table 会快速翻转。
所以我有以下代码
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=]秒。
多个线程 运行 同时发生同样的事情。
我对这种行为的可能解释是,由于 queues
是 multithreading
和 multiprocessing
安全的并且具有内置的互斥实现,所以只有一个 thread
或 process
可以一次访问队列。
因此,对于单个 process/thread,python
解释器或 CPU 无需抢占,以确保每个 thread/process 都有平等机会 运行 他们的代码,但是多次 processes/threads 这种抢占的成本增加了程序的总 运行 时间。
所以我正在考虑正确的路线,还是因为其他原因而发生这种情况。
这并不奇怪。你什么都没做。因此,您要测量的是生成多个进程、设置进程间通信以及通过这些通道编组和解组数据的开销。这太贵了。
但是尝试在检查器中进行一些实际计算,table 会快速翻转。