繁体   English   中英

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

[英]Python: multiprocessing, pathos and what not

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

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

这个test_reduce()过程做了很多事情。 其中一些与其他问题更相关(我在下面列出):

  • 它使用multiprocessing模块(sic!) ,即pool.Pool实例,
  • 它使用MongoDB连接,
  • 它在很大程度上依赖于numpyscikit-learn libs,
  • 它使用回调和lambda,
  • 它使用dill库来腌制一些东西。

首先,我尝试使用multiprocessing.dummy.Pool (它似乎是一个线程池)。 我不知道这个游泳池的具体内容是什么,为什么呢,呃,“虚拟”; 整个过程都奏效了,我得到了我的结果。 问题是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应该受到指责,并且发现使用更高级的pickler dillpathos lib。 但它也失败了:

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 ,因此很难猜出发生了什么。 我唯一知道的是,当没有使用多处理时, test_reduce()成功运行。

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

所以,感谢@MikeMcKerns的回答,我发现如何获得与完成工作pathos库。 我需要摆脱所有的pymongo游标,它们(作为发电机)不能被dill腌制; 这样做解决了问题,我设法并行运行我的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM