我一直在忙着使用线程和进程一段时间来尝试加速我在IPython中的并行工作。我不确定我调用的函数有多少细节是有用的,所以这里有一个bash但是问你是否需要更多。
我的函数的调用签名看起来像
def intersplit_array(ob,er,nl,m,mi,t,ti,dmax,n0=6,steps=50):
基本上,ob
,er
和nl
是观察值的参数,m
,mi
,t
,{{1} }和ti
是表示将与其进行比较的模型的参数。 (dmax
和n0
是函数的固定数值参数。)函数循环遍历steps
中的所有模型,并使用m
中的相关信息{{1} },mi
和t
计算此模型匹配的概率。请注意ti
非常大:它是大约70万个22x3 NumPy数组的列表。 dmax
和m
的大小相似。如果相关,我的普通IPython实例使用mi
中大约25%的系统内存:4GB的16GB内存。
我试图以两种方式将其并行化。首先,我尝试使用at the SciPy Cookbook上给出的dmax
函数。我打了电话
top
运行,并提供正确的答案。如果没有parallel_map
部分,这只是将函数逐个应用于每个元素的结果。但这比使用单核更慢。我想这与Global Interpreter Lock有关吗?
其次,我尝试使用P = parallel_map(lambda i: intersplit_array(ob,er,nl,m[i+1],mi[i:i+2],t[i+1],ti[i:i+2],dmax[i+1],range(1,len(m)-1))
中的parallel_
。我用
Pool
然后尝试用
调用我的函数multiprocessing
首先,我收到错误。
p = multiprocessing.Pool(6)
看一下P = p.map(lambda i: intersplit_array(ob,er,nl,m[i+1],mi[i:i+2],t[i+1],ti[i:i+2],dmax[i+1],range(1,len(m)-1))
,然后我会看到所有额外的Exception in thread Thread-3:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 551, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.7/threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 319, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
进程,每个进程显然占用了25%的RAM(不可能是这样,因为我还是获得4GB免费)并使用0%CPU。我认为它没有做任何事情。我也不能使用IPython。我尝试了一段时间的Ctrl-C,但是一旦我通过第300名游泳池工作人员就放弃了。
答案 0 :(得分:2)
它是否以交互方式 工作?
由于分割过程的方式, multiprocessing
无法以交互方式播放。这也是你杀死它的原因,因为它催生了这么多进程。您必须跟踪主进程才能取消它。
注意强>
此程序包中的功能要求__main__
模块可由子项导入。 Programming guidelines 中对此进行了介绍,但值得指出。这意味着某些示例(例如multiprocessing.Pool
示例)在交互式解释器中不起作用...
如果您尝试这样做,它实际上将以半随机方式交错输出完整的回溯,然后您可能必须以某种方式停止主进程。
最好的解决方案可能是从命令行将其作为脚本运行。或者,IPython has its own system for parallel computing,但我从未使用它。