【发布时间】:2016-09-29 21:18:12
【问题描述】:
我正在做一个简单的多处理测试,但似乎有些不对劲。我在带有 Turbo Boost 的 i5-6200U 2.3 Ghz 上运行它。
from multiprocessing import Process, Queue
import time
def multiply(a,b,que): #add a argument to function for assigning a queue
que.put(a*b) #we're putting return value into queue
if __name__ == '__main__':
queue1 = Queue() #create a queue object
jobs = []
start_time = time.time()
#####PARALLEL####################################
for i in range(0,400):
p = p = Process(target= multiply, args= (5,i,queue1))
jobs.append(p)
p.start()
for j in jobs:
j.join()
print("PARALLEL %s seconds ---" % (time.time() - start_time))
#####SERIAL################################
start_time = time.time()
for i in range(0,400):
multiply(5,i,queue1)
print("SERIAL %s seconds ---" % (time.time() - start_time))
输出:
PARALLEL 22.12951421737671 seconds ---
SERIAL 0.004009723663330078 seconds ---
非常感谢您的帮助。
【问题讨论】:
-
创建一个进程比两个小整数相乘要昂贵得多;并且创建比 CPU 多得多的进程会使情况变得更糟(所有进程在有限的 CPU 周期内相互竞争)。要看到任何加速,每个工作进程中完成的“有用工作”需要不平凡(比进程创建+销毁和 IPC(进程间通信)的开销花费更多的时间)。
-
为什么要创建 400 个进程并将乘法值存储到队列中?
-
那我应该怎么做呢?你能指出我正确的资源吗?我应该使用游泳池还是什么?我真的很困惑。我需要将值存储到队列中,因为我需要获取过程的结果,并且通过谷歌搜索,队列似乎是这样做的方法
-
你所做的并没有错。当您为每个进程所做的工作是如此微不足道,以至于开始创建一个进程的成本远更高时,根本不可能获得加速。您可以尝试使用
Pool来代替,使用“只有几个”进程(例如,不超过您拥有的 CPU 数量)。这将大大减少浪费在创建流程上的时间。但是,IPC 仍然比两个小整数相乘更昂贵——你不会得到任何加速。你需要的是一个更昂贵的问题来解决;-)
标签: python multiprocessing python-multiprocessing