问题标签 [pathos]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3733 浏览

python - Python multiprocessing.Pool 忽略类方法

我最近为我的研究编写了一个带有类的程序,并且我试图将它并行化。当我将 Python 2.7 的 multiprocessing.Process 与 JoinableQueue 和托管数据一起使用时,我的程序最终会因已失效的进程而挂起。

_calc_parallel 调用其他一些类方法。

我什至尝试使用 multiprocessing.Pool 为此目的使用http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods上其他地方的 copy_reg 选项。

但是,pool.map_async 似乎没有调用 self._calc_parallel。我知道在这两种情况下(进程和池),我都忽略了一些东西,但我不太清楚是什么。我通常处理超过 40,000 个元素。

谢谢您的帮助。

更新

在阅读了其他几篇文章后,我也尝试了 pathos.multiprocessing。

而且,与我之前的尝试一样,这似乎也可以在不调用该方法的情况下快速完成。

更新 2

我决定修改代码,将我的庞然大物类拆分成更小、更易于管理的组件。但是,如果我使用 pathos.multiprocessing,我会遇到与之前发布的不同的情况(请参阅链接)。我的新代码现在有一个可用于计算的对象,然后通过其方法返回一个值。

我认为这是一个单独的功能func(dataobj, force),但这似乎也无济于事。以目前的速度,我估计单个处理器上的完整计算需要 1000 多个小时,这对于应该更快的东西来说太长了。

更新 3 (4/30/15)

由于@MikeMcKerns 有用的见解,我可能已经确定了一个可能的解决方案。在 iMac(四核)或集群的 16 核节点上,我发现对于没有键的粗粒度(CG)系统,双倍itertools.imap似乎是我最好的解决方案(1000 个 CG 站点)时钟每个轨迹帧大约 5.2 秒。当我进入一个包含一些键细节的系统(3000 个代表水的 CG 站点)时,我发现在 iMac 上(使用 1 个核心),itertools.imap然后是pathos.ThreadingPool.uimap(4 个线程)以大约 85 秒/帧的速度运行;如果我按照@MikeMcKerns 的评论中的建议尝试进程池(4 核 x 2)/线程池(4 线程),计算时间增加了 2.5 倍。在 16 核集群(32 pp/16 tp)上,这个 CG 系统运行速度也很慢(大约 160 秒/帧)。在 iMac(1 核/4 线程)上具有 42,778 个站点和众多键的 CG 系统可能会以大约 58 分钟/帧的速度运行。我还没有在集群的 16 核节点上测试这个大型系统,但我不确定是否使用进程池/线程池来进一步加快速度。

例子:

我怀疑系统越大,我从多处理中获得的好处就越多。我知道大型 CG 系统(42,778 个站点)大约需要 0.08 秒/站点,而 0.02 秒/站点(3000 个 CG 站点)或 0.05 秒/站点(1000 个站点无键)。

在我努力减少计算时间的过程中,我发现了可以减少一些计算的区域(例如,global变量和算法更改),但是如果我可以通过全面的多线程处理进一步减少它,那就太好了。

0 投票
2 回答
503 浏览

python - pathos.multiprocessing 中的 WindowsError

运行上面给出了以下错误:

这是在交互式 IPython 控制台(Python 2.7 的 Anaconda Distribution)中的 Windows 7 64 位机器上。我正在使用 pathos 版本 0.2a1.dev0 和 Dill 版本 0.2.2。当我创建一个“池”时,这个错误似乎是可重现的。

0 投票
2 回答
2828 浏览

python-3.4 - 使用池映射的并行列表理解

我有一个列表理解:

我将其并行化如下:

但我收到以下错误:

我试图安装pathos显然解决了这个问题的包,但是当我尝试导入它时,我得到了错误:

0 投票
1 回答
977 浏览

python - Python,pathos - 新线程上的命名空间更改

我开始使用 pathos.multiprocessing 来消除在处理诸如 logging.logger 之类的重要对象时的一些麻烦。但是,我遇到了导入在新线程中不可用的问题。结果,我必须在那个新线程中“重新导入”这些模块。具体来说,由于以下错误,此案例将无法运行:

即使在内置的多处理模块下,以下代码也不起作用:

但是,以下代码将适用于 pathos.multiprocessing

用下面的例子

两段代码都应输出以下输出(显然不一定以相同的顺序):

我希望能够使用第一段代码的一些变体,因为这与代码库的其余部分一致。但是,非常感谢任何帮助。

0 投票
1 回答
1129 浏览

python - Python:多处理、悲情等等

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

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

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

  • 它使用multiprocessing模块(sic!),即一个pool.Pool实例,
  • 它使用 MongoDB 连接,
  • 它严重依赖numpyscikit-learn库,
  • 它使用回调和 lambda,
  • 它使用dill库来腌制一些东西。

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

然后我尝试使用这个程序的multiprocessing.pool.Pool实例来map处理我的数据。它失败了:

我猜测这cPickle是罪魁祸首,并找到了pathos使用更高级 pickler的库dill。然而它也失败了:

现在,这个错误是我完全不明白的。当它在池中工作时,我的程序没有输出stdout,所以很难猜测发生了什么。我唯一知道的是,test_reduce()当不使用多处理时,它会成功运行。

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

0 投票
1 回答
437 浏览

python - 通过多处理返回二维数组

在下面的代码中,这是我的主要代码示例,我尝试使用它pathos.multiprocessing来提高循环的迭代速度。使用多处理实现的每次迭代的输出是一个二维数组。我使用pathos.multiprocessing而不是multiprocessing因为我想在我的类方法中使用它。我使用apipe的方法pathos.multiprocessing将输出收集到一个列表中,但它返回一个空列表。我不知道为什么会失败

有什么建议吗?

0 投票
1 回答
4734 浏览

python - 多处理-> pathos.multiprocessing 和 windows

我目前正在使用 python 中的标准多处理来生成一堆将无限期运行的进程。我并不特别关心性能。每个线程只是在观察文件系统上的不同变化,并在文件被修改时采取适当的行动。

目前,我有一个在 Linux 中可以满足我需求的解决方案。我有一个函数和参数字典,如下所示:

对于每一个,我创建一个流程:

有了这个,我可以跟踪每个正在运行的任务,并且在必要时重新启动因任何原因崩溃的作业。

这在 Windows 中不起作用。我使用的许多函数都是包装器,使用各种functools函数,并且我收到有关无法序列化函数的消息(请参阅多处理和 dill 可以一起做什么?)。我还没有弄清楚为什么我在 Linux 中没有出现此错误,但在 Windows 中却出现了。

如果我在 Windows 中启动进程之前导入dill,我不会收到序列化错误。然而,这些进程实际上并没有做任何事情。我不知道为什么。

然后我切换到 中的多处理实现pathos,但没有在标准模块中找到简单Process类的模拟。multiprocessing我能够使用pathos.pools.ThreadPool. 我敢肯定,这不是 map 的预期用途,但它启动了所有线程,并且它们在 Windows 中运行:

但是,现在我不确定如何监视线程​​是否仍然处于活动状态,我正在寻找它以便我可以重新启动由于某种原因而崩溃的线程。有什么建议么?

0 投票
2 回答
3383 浏览

python - Python 多处理:AttributeError:“测试”对象没有属性“get_type”

短版:

我无法并行化使用实例方法的代码。

更长的版本:

此 python 代码产生错误:

这是我遇到的一个实际问题的简化版本。

由于这里的建议,我正在使用 pathos.multiprocessing: Multiprocessing: Pool and pickle Error -- Pickling Error: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

在使用 pathos.multiprocessing 之前,错误是:

0 投票
1 回答
2433 浏览

python - 当 sys.path 不同时, dill python 模块是否处理导入模块?

我正在评估莳萝,我想知道这种情况是否得到处理。我有一个案例,我在 python 进程中成功导入了一个模块。我可以使用 dill 进行序列化,然后将该模块加载到具有不同 sys.path 且不包含该模块的不同进程中吗?现在我遇到导入失败,但也许我做错了什么。

这是一个例子。我运行这个脚本,其中 foo.py 模块的路径在我的 sys.path 中:

现在,我在我的 PYTHONPATH 中没有 foo.py 目录的地方运行这个脚本:

此堆栈跟踪失败:

那么,如果我需要在两个进程之间有相同的 python 路径,那么序列化 python 模块有什么意义呢?或者换句话说,通过 dill 加载 foo 比仅仅调用“import foo”有什么优势吗?

0 投票
2 回答
1177 浏览

python - 与 pathos.multiprocessing 并行安全地写入文件

pathos.multiprocessing众所周知,它比 Python 中的库具有优势multiprocessing,因为前者使用dill而不是pickle并且可以序列化更广泛的函数和其他东西。

pool.map()但是,当使用 将结果逐行写入文件时pathos,就会遇到一些麻烦。如果写入中的所有进程ProcessPool逐行写入单个文件,它们会相互干扰同时写入一些行并破坏工作。在使用普通multiprocessing包时,我能够让进程写入自己的单独文件,以当前进程 ID 命名,如下所示:

然后,这段代码运行良好:

但是这段代码没有:

并抛出AttributeError

没有current_process()in pathos,我找不到任何类似的东西。有任何想法吗?