Python:多处理,病态和什么不是

时间:2015-07-07 15:06:06

标签: python multiprocessing pickle pathos

我必须提前道歉,因为这个问题很普遍,可能不够清楚。问题是:如何并行运行Python函数,该函数本身使用某些子任务的进程池并执行大量繁重的I / O操作?它甚至是一项有效的任务吗?

我会尝试提供更多信息。我有一个程序,比如test_reduce(),我需要并行运行。我尝试了几种方法(见下文),我似乎缺乏一些知识来理解为什么所有这些都失败了。

这个test_reduce()程序可以很多。其中一些与其他问题更相关(我在下面列出):

  • 它使用multiprocessing模块(原文!),即pool.Pool个实例,
  • 它使用MongoDB连接,
  • 它严重依赖于numpyscikit-learn库,
  • 它使用回调和lambdas,
  • 它使用dill lib来挑选一些东西。

首先,我尝试使用multiprocessing.dummy.Pool(似乎是一个线程池)。我不知道这个池的具体内容及其原因,呃," dummy&#34 ;;整个过程都奏效了,我得到了我的结果。 问题是CPU负载。对于test_reduce()的并行部分,所有核心都是100%;对于同步部分,大多数情况下它约为40-50%。我不能说这种类型的"并行"整体速度有任何增加。执行。

然后我尝试使用multiprocessing.pool.Pool实例将map此过程用于我的数据。它失败了以下:

File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get
    raise self._value
cPickle.PicklingError: Can't pickle <type 'thread.lock'>: attribute lookup thread.lock failed

我猜测cPickle应该受到指责,并找到使用更高级的选择器pathos的{​​{1}}库。但它也失败了:

dill

现在,错误是我根本无法理解的。当它在游泳池中工作时我从我的程序中没有输出到File "/local/lib/python2.7/site-packages/dill/dill.py", line 199, in load obj = pik.load() File "/usr/lib/python2.7/pickle.py", line 858, in load dispatch[key](self) File "/usr/lib/python2.7/pickle.py", line 1083, in load_newobj obj = cls.__new__(cls, *args) TypeError: object.__new__(generator) is not safe, use generator.__new__() ,所以很难猜出发生了什么。我唯一知道的是,当没有使用多处理时stdout成功运行。

那么,你将如何并行运行繁重而复杂的东西?

1 个答案:

答案 0 :(得分:1)

所以,感谢@MikeMcKerns的回答,我找到了如何使用pathos lib完成工作。我需要摆脱所有pymongo游标,dill无法腌制(生成器)游标;这样做解决了问题,我设法并行运行我的代码。