在Windows上使用Python多进程时CPU(所有核心)变为闲置状态
我的系统是Windows 7。我写了一个Python程序来做数据分析。我使用了multiprocessing
库来实现并行处理。当我打开Windows PowerShell,输入python MyScript.py
时,它会开始使用所有的CPU核心。但过了一会儿,所有的CPU核心就变得闲置了。不过,如果我在PowerShell窗口里按一下Enter
键,所有核心又会恢复到满负荷工作。为了说明,程序本身没有问题,已经测试过了。这里的问题是CPU核心自己变得闲置了。
这种情况不仅发生在我的办公室电脑上(运行Windows 7专业版),也发生在我家里的台式机上(运行Windows 7终极版)。
程序的并行部分非常简单:
def myfunc(input):
##some operations based on a huge data and a small data##
operation1: read in a piece of HugeData #query based HDF5
operation2: some operation based on HugeData and SmallData
return output
# read in Small data
SmallData=pd.read_csv('data.csv')
if __name__ == '__main__':
pool = mp.Pool()
result=pool.map_async(myfunc, a_list_of_input)
out=result.get()
我的函数主要是用Pandas
进行数据处理。
程序没有任何问题,因为我已经成功运行过几次。但我必须一直盯着它,当核心变闲置时就按一下Enter
。这个工作需要几个小时,我真的不想一直看着它。
这是Windows系统本身的问题,还是我的程序的问题呢?
顺便问一下,所有核心都能访问存储在内存中的同一个变量吗?比如,我在if __name__ == '__main__':
之前读取了一个数据集mydata
到内存中。这个数据会在myfunc
中使用。所有核心应该能同时访问mydata
,对吧?
请帮帮我!
2 个回答
我被引导到这个问题,因为我在使用Python的多进程库时也遇到了类似的问题,系统是Ubuntu。在我的情况中,进程并不是通过按回车键等方式启动的,而是过了一段时间后突然开始。我的代码是一个迭代的启发式算法,每次迭代都使用多进程。我必须在完成一些迭代后重新运行代码,以便获得稳定的运行性能。这个问题是很久以前提出的,你有没有找到真正的原因和解决办法呢?
我承认我不太理解map_async的细节,但我不确定你是否可以那样使用它(我似乎根本无法让它工作)...
我通常使用以下方法(就是我想要执行的调用的列表推导):
In [11]: procs = [multiprocessing.Process(target=f, args=()) for _ in xrange(4)]
....: for p in procs: p.start()
....: for p in procs: p.join()
....:
这个方法简单,并且会等到所有任务完成后再继续。
只要你不对pandas对象进行修改,这个方法就能很好地工作...(我觉得)每个线程会接收到对象的副本,如果你进行修改,这些修改不会被传播,最后会被垃圾回收。
你可以使用multiprocessing的Manager类来创建一个共享的字典或列表,这样可以用来存储每个任务的结果(只需在函数内部访问这个字典/列表即可):
mgr = multiproccessing.Manager()
d = mgr.dict()
L = mgr.list()
这样它们就可以共享访问(就像你写了一个锁一样)。值得一提的是,如果你在一个列表中添加内容,那么顺序可能不会和进程的顺序一样!
你可能能够为pandas对象做类似于Manager的事情(在内存中对对象写锁而不复制),但我觉得这会是个不简单的任务...