我习惯使用ipcluster
中的ipyparallel
,在这里我可以通过dview['object'] = object
将对象上载到工作人员。
我想知道如何使用multiprocessing
执行此操作。我希望它是异步的,因此我最终可以将已完成显示进度条的作业制成表格,但是目前,我主要感兴趣的是上载对象(例如,大内存数据框),这样我就不必用函数传递它,从而减慢速度:
from ipyparallel import Client
import pandas as pd
rc = Client(profile='default')
dview = rc[:]
lview = rc.load_balanced_view()
myobject = pd.read_table('/some/path/')
# ############################################
dview['myobject'] = myobject #### <- how do I do this using multiprocess?
# ############################################
def dowork(rowstart):
rowend = rowstart + (1000-1)
...
return pd.DataFrame(work)
jobs = []
for i in range(0,len(myobject.index),1000):
jobs.append(lview.apply_async(dowork, i))
newdf = pd.concat([j.r for j in jobs])
Q:如何使用
multiprocessing
执行此操作?
根据定义,python中基于进程的并行性将python解释器的整个状态(包括其所有内部变量等)复制到新的工作进程实例化后。操作系统决定如何完成或无法完成(有关所有详细信息,风险和其他缺陷,请阅读multiprocessing
文档)。
虽然这是一个昂贵但主要需要的步骤,以便摆脱所有python处理的中央GIL锁垄断重新实现,但是此方法可确保您的进程“知道” [SERIAL]
设计(myobject
必须将对象重新广播到所有远程节点,并且由于成本增加了几个数量级(从几百个icluster
到远高于[C0 ])的本地/远程[ns]
操作+ L2 / L3网络级传输服务的延迟,它使您不必担心会分散您的代码所需的所有对象,而要在工作要进行之前手动进行分配启动。并置[ms]
生成的进程“知道”与父python解释器相同的内容,因此在这种情况下您的生活变得更加轻松。