问题标签 [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.
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
变量和算法更改),但是如果我可以通过全面的多线程处理进一步减少它,那就太好了。
python - pathos.multiprocessing 中的 WindowsError
运行上面给出了以下错误:
这是在交互式 IPython 控制台(Python 2.7 的 Anaconda Distribution)中的 Windows 7 64 位机器上。我正在使用 pathos 版本 0.2a1.dev0 和 Dill 版本 0.2.2。当我创建一个“池”时,这个错误似乎是可重现的。
python-3.4 - 使用池映射的并行列表理解
我有一个列表理解:
我将其并行化如下:
但我收到以下错误:
我试图安装pathos
显然解决了这个问题的包,但是当我尝试导入它时,我得到了错误:
python - Python,pathos - 新线程上的命名空间更改
我开始使用 pathos.multiprocessing 来消除在处理诸如 logging.logger 之类的重要对象时的一些麻烦。但是,我遇到了导入在新线程中不可用的问题。结果,我必须在那个新线程中“重新导入”这些模块。具体来说,由于以下错误,此案例将无法运行:
即使在内置的多处理模块下,以下代码也不起作用:
但是,以下代码将适用于 pathos.multiprocessing
用下面的例子
两段代码都应输出以下输出(显然不一定以相同的顺序):
我希望能够使用第一段代码的一些变体,因为这与代码库的其余部分一致。但是,非常感谢任何帮助。
python - Python:多处理、悲情等等
我必须提前道歉,因为这个问题很笼统,可能不够清楚。问题是:如何并行运行一个 Python 函数,该函数本身使用一个进程池来处理某些子任务并执行大量繁重的 I/O 操作?它甚至是一个有效的任务吗?
我将尝试提供更多信息。我有一个程序,比如说test_reduce()
,我需要并行运行。我尝试了几种方法来做到这一点(见下文),我似乎缺乏一些知识来理解为什么所有这些方法都失败了。
这个test_reduce()
过程做了很多事情。其中一些比其他更与问题相关(我在下面列出):
- 它使用
multiprocessing
模块(sic!),即一个pool.Pool
实例, - 它使用 MongoDB 连接,
- 它严重依赖
numpy
和scikit-learn
库, - 它使用回调和 lambda,
- 它使用
dill
库来腌制一些东西。
首先我尝试使用一个multiprocessing.dummy.Pool
(这似乎是一个线程池)。我不知道这个池有什么特别之处,为什么它是,嗯,“虚拟”;整个事情都奏效了,我得到了我的结果。问题是CPU负载。对于所有内核的并行化部分,test_reduce()
它是 100%;对于同步部分,大部分时间约为 40-50%。我不能说这种“并行”执行的整体速度有任何提高。
然后我尝试使用这个程序的multiprocessing.pool.Pool
实例来map
处理我的数据。它失败了:
我猜测这cPickle
是罪魁祸首,并找到了pathos
使用更高级 pickler的库dill
。然而它也失败了:
现在,这个错误是我完全不明白的。当它在池中工作时,我的程序没有输出stdout
,所以很难猜测发生了什么。我唯一知道的是,test_reduce()
当不使用多处理时,它会成功运行。
那么,你将如何并行运行如此繁重和复杂的东西?
python - 通过多处理返回二维数组
在下面的代码中,这是我的主要代码示例,我尝试使用它pathos.multiprocessing
来提高循环的迭代速度。使用多处理实现的每次迭代的输出是一个二维数组。我使用pathos.multiprocessing
而不是multiprocessing
因为我想在我的类方法中使用它。我使用apipe
的方法pathos.multiprocessing
将输出收集到一个列表中,但它返回一个空列表。我不知道为什么会失败
有什么建议吗?
python - 多处理-> pathos.multiprocessing 和 windows
我目前正在使用 python 中的标准多处理来生成一堆将无限期运行的进程。我并不特别关心性能。每个线程只是在观察文件系统上的不同变化,并在文件被修改时采取适当的行动。
目前,我有一个在 Linux 中可以满足我需求的解决方案。我有一个函数和参数字典,如下所示:
对于每一个,我创建一个流程:
有了这个,我可以跟踪每个正在运行的任务,并且在必要时重新启动因任何原因崩溃的作业。
这在 Windows 中不起作用。我使用的许多函数都是包装器,使用各种functools
函数,并且我收到有关无法序列化函数的消息(请参阅多处理和 dill 可以一起做什么?)。我还没有弄清楚为什么我在 Linux 中没有出现此错误,但在 Windows 中却出现了。
如果我在 Windows 中启动进程之前导入dill
,我不会收到序列化错误。然而,这些进程实际上并没有做任何事情。我不知道为什么。
然后我切换到 中的多处理实现pathos
,但没有在标准模块中找到简单Process
类的模拟。multiprocessing
我能够使用pathos.pools.ThreadPool
. 我敢肯定,这不是 map 的预期用途,但它启动了所有线程,并且它们在 Windows 中运行:
但是,现在我不确定如何监视线程是否仍然处于活动状态,我正在寻找它以便我可以重新启动由于某种原因而崩溃的线程。有什么建议么?
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 之前,错误是:
python - 当 sys.path 不同时, dill python 模块是否处理导入模块?
我正在评估莳萝,我想知道这种情况是否得到处理。我有一个案例,我在 python 进程中成功导入了一个模块。我可以使用 dill 进行序列化,然后将该模块加载到具有不同 sys.path 且不包含该模块的不同进程中吗?现在我遇到导入失败,但也许我做错了什么。
这是一个例子。我运行这个脚本,其中 foo.py 模块的路径在我的 sys.path 中:
现在,我在我的 PYTHONPATH 中没有 foo.py 目录的地方运行这个脚本:
此堆栈跟踪失败:
那么,如果我需要在两个进程之间有相同的 python 路径,那么序列化 python 模块有什么意义呢?或者换句话说,通过 dill 加载 foo 比仅仅调用“import foo”有什么优势吗?
python - 与 pathos.multiprocessing 并行安全地写入文件
pathos.multiprocessing
众所周知,它比 Python 中的库具有优势multiprocessing
,因为前者使用dill
而不是pickle
并且可以序列化更广泛的函数和其他东西。
pool.map()
但是,当使用 将结果逐行写入文件时pathos
,就会遇到一些麻烦。如果写入中的所有进程ProcessPool
逐行写入单个文件,它们会相互干扰同时写入一些行并破坏工作。在使用普通multiprocessing
包时,我能够让进程写入自己的单独文件,以当前进程 ID 命名,如下所示:
然后,这段代码运行良好:
但是这段代码没有:
并抛出AttributeError
:
没有current_process()
in pathos
,我找不到任何类似的东西。有任何想法吗?