gpt4 book ai didi

Python:多处理、悲伤等等

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:34 25 4
gpt4 key购买 nike

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

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

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

  • 它使用多处理模块(原文如此!),即pool.Pool实例,
  • 它使用 MongoDB 连接,
  • 它在很大程度上依赖于 numpyscikit-learn 库,
  • 它使用回调和 lambda,
  • 它使用 dill 库来 pickle 一些东西。

首先我尝试使用multiprocessing.dummy.Pool(这似乎是一个线程池)。我不知道这个池有什么特别之处,以及为什么它是,嗯,“虚拟”;整个过程成功了,我得到了结果。 问题 是 CPU 负载。对于 test_reduce() 的并行化部分,所有内核都是 100%;对于同步部分,大部分时间约为 40-50%。我不能说这种“并行”执行的总体速度有任何提高。

然后我尝试使用 multiprocessing.pool.Pool 实例将此过程映射到我的数据。失败并显示以下内容:

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 库使用了更高级的 pickler 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,因此很难猜测发生了什么。我唯一知道的是 test_reduce() 在未使用多处理时成功运行。

那么,您将如何并行运行如此繁重和复杂的东西?

最佳答案

因此,感谢@MikeMcKerns 的回答,我找到了如何使用 pathos 库完成工作。我需要摆脱所有 pymongo 游标,它们(作为生成器)不能被 dill pickle ;这样做解决了问题,我设法并行运行我的代码。

关于Python:多处理、悲伤等等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31272427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com