问题标签 [python-multiprocessing]

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 投票
0 回答
325 浏览

python - gevent影响python3中的多处理

我想在一个程序中同时使用多处理和 gevent,这是我的代码:

我注释掉第二行和第三行。如果我取消评论,程序将永远无法正常运行。为什么 gevent 会影响多处理?如何解决这个问题,以便我可以在一个程序文件中同时使用多处理和 gevent?

0 投票
0 回答
496 浏览

python - bash fetch stdout/stderr of python multiprocessing Process

我有某种使用 ZeroMQ 在 Python 中本地运行的多代理系统。主线程作为主线程(python Admin.py)启动,而这个主线程将工作代理作为multiprocessing.Process子进程启动。

Admin.py 和工作人员都使用简单的print命令编写输出。现在我尝试获取我在控制台上看到的所有$ python Admin.py > file.txt输出: . 但是这个语句只获取 Admin.py 写入的输出。我尝试了各种重定向,例如将 sterr 管道传输到 stdout,然后获取 stdout ( 1>&2 > file.txt),但没有任何结果。这个问题已经在 Satckoverflow(这里这里)上以各种形式提出,答案似乎涉及相当多的额外 python 编码。这个问题有 Bash 解决方案吗?我在控制台上看到了所有输出,那么为什么 Bash 不能将其重定向到文件?

0 投票
2 回答
1053 浏览

python - 如果 Python 受 GIL 约束,为什么要提供锁定机制?

我知道 Python 线程一次只能执行一个字节码,那么为什么线程库会提供锁呢?我假设如果一次只执行一个线程,就不会发生竞争条件。

该库提供锁、条件和信号量。这样做的唯一目的是同步执行吗?

更新:

我做了一个小实验:

基本上我应该启动 100k 线程并递增 1。返回的结果是 99993。

a) 如果有 GIL 同步并避免竞争条件,结果怎么可能不是 99999?b) 甚至可以启动 100k OS 线程吗?

更新2,看到答案后:

如果 GIL 并没有真正提供一种方法来执行像原子递增这样的简单操作,那么将它放在那里的目的是什么?它对解决令人讨厌的并发问题没有帮助,那么为什么要实施它呢?我听说过 C 扩展的用例,有人可以举例说明吗?

0 投票
2 回答
2127 浏览

python - 使用 RPYC“ValueError:酸洗已禁用”的多处理 Python

我试图在rpyc服务中使用多处理包,但是ValueError: pickling is disabled当我尝试从客户端调用公开的函数时得到。我了解该multiprocesing程序包使用酸洗在进程之间传递信息,并且不允许酸洗,rpyc因为它是不安全的协议。所以我不确定将多处理与 rpyc 一起使用的最佳方法(或者是否有)。如何在 rpyc 服务中使用多处理?这是服务器端代码:

这是产生错误的客户端代码:

0 投票
1 回答
2116 浏览

python - Python 多处理。处理父进程异常,让所有子进程优雅地死去

我有以下代码。

这使用了一个名为 decorator 的 python 模块。

装饰器模块帮助我装饰我的数据仓库调用函数。所以我不需要处理连接丢失和各种基于连接的问题,并允许我重置连接并在超时后重试。我用这种方法装饰了我所有的数据仓库读取功能,所以我可以免费重试。

我有以下方法。

我尝试使用这样的多处理模块对我的代码进行多处理。

当一切顺利时,一切都是正常的。当它在重试次数内自行修复时,情况也很正常。但是一旦重试次数超过我会在 test_retry 方法中引发异常,该异常不会在主进程中被捕获。进程死亡,主进程分叉的进程被保留为孤儿。可能是我在这里做错了什么。我正在寻找一些帮助来解决以下问题。将异常传播到父进程,以便我可以处理异常并使我的孩子优雅地死去。另外我想知道如何通知子进程优雅地死去。在此先感谢您的帮助 。

编辑:添加了更多代码来解释。

实际问题归结为如果生成器抛出异常,我无法在包含 pool.imap_unordered() 方法的 except 子句中捕获生成器抛出的异常。所以在抛出异常后,主进程被卡住,子进程永远等待。不确定我在这里做错了什么。

0 投票
1 回答
12960 浏览

python - 如何命名 multiprocessing.pool 中的进程?

如果我创建一个有 4 个工作人员的池并将它们设置为执行某些任务(使用pool.apply_async(..)),我可以从使用中访问每个进程的名称multiprocessing.current_process().name,但是如何从父进程设置名称(这主要用于日志记录)?

0 投票
1 回答
2086 浏览

python - Python 多处理与分布式集群使用 Pathos

我试图在几台不同的计算机上使用多处理,这pathos似乎是为了:“Pathos 是异构计算的框架。它主要提供用于跨异构资源配置和启动并行计算的通信机制。” 然而,在查看文档时,我不知道如何启动和运行集群。我期待:

  1. 设置具有安全身份验证的远程服务器或一组远程服务器。
  2. 安全地连接远程服务器。
  3. pool.map使用标准多处理包中的简单 API(如此相关问题中的伪代码)在远程服务器和我的本地计算机中的所有 CPU 上映射任务。

我没有看到 (1) 的示例,也不理解为 (2) 提供的隧道示例。该示例实际上并未连接到 localhost 上的现有服务。我还想知道我是否/如何要求此通信附带某种密码/密钥,以防止其他人连接到服务器。我知道这使用 SSH 身份验证,但缺少一个预先存在的密钥,该密钥只​​能确保流量在通过 Internet 时不会被读取,但不会阻止其他人劫持服务器。

0 投票
1 回答
1964 浏览

python - 从多处理进程更新 PySide GUI

我正在尝试创建一个由多处理进程更新的 PySide GUI,例如在经过一些计算后更新的窗口中显示文本的 PySide GUI。通过使用 QThread,我可以毫无问题地更新 GUI。但是,如果我尝试使用多处理进程而不是 QThread 来执行相同的操作(参见 sys.exit 之前的两行代码),我会收到错误消息。这是一个最小的例子:

问题是显然只能从主进程操作 GUI,因此尝试从新进程操作它会引发此错误:

我的直接反应是——只需在 QThread 中运行计算。但是计算本身非常繁重,所以我真的需要完全在一个单独的进程(和核心)中运行它。谢谢!

0 投票
1 回答
6089 浏览

python - Python 多处理队列比 pool.map 慢

我最近开始尝试使用多处理来加速任务。我创建了一个执行模糊字符串匹配并使用不同算法计算分数的脚本(我想比较不同的匹配技术)。你可以在这里找到完整的源代码:https ://bitbucket.org/bergonzzi/fuzzy-compare/src 。作为输入,它需要 2 个文件,它们组合成对(file1 的每一行与 file2 的每一行)。对于每一对,计算模糊匹配分数。

我做了3个版本。使用我的 repo 中提供的示例数据(组合成对后由 697.340 个项目组成)运行,我有以下时间:

  • 简单的单一流程 - 0:00:47
  • 使用 Pool.map() 的多进程 - 0:00:13
  • 使用队列的多进程(生产者/消费者模式) - 0:01:04

我试图理解为什么我的 Pool.map() 版本比我的 Queue 版本快得多,这实际上比简单的单进程版本要慢。

我什至尝试使用 Queues 的原因是 Pool.map() 版本会保留结果,直到一切都完成并且最后只写入文件。这意味着对于大文件,它最终会占用大量内存。我说的是这个版本(链接到它,因为这里要粘贴很多代码)。

为了解决这个问题,我将它重构为生产者/消费者模式(或至少尝试过)。在这里,我首先通过组合两个输入文件来生成作业,并将它们放入消费者处理的队列中(计算模糊匹配分数)。完成的作业被放入一个出队列。然后我有一个进程从这个队列中抓取完成的项目并将它们写入文件。这样,理论上,我不需要太多内存,因为结果会被刷新到磁盘。它似乎工作正常,但速度要慢得多。我还注意到,在 Mac OSX 上查看 Activity Monitor 时,我生成的 4 个进程似乎没有使用 100% 的 CPU(Pool.map() 版本不是这种情况)。

我注意到的另一件事是,我的生产者函数似乎正确填满了队列,但消费者进程似乎等到队列填满,而不是在第一个项目到达时立即开始工作。我可能在那里做错了什么......

作为参考,这里有一些队列版本的相关代码(尽管最好查看上面链接的 repo 中的完整代码)。

这是我的生产者功能:

这是编写器功能:

这是执行实际计算的工作函数(删除了大部分代码,因为它在这里没有任何区别,repo 上的完整源代码):

这就是我设置流程的方式:

我在这里读过很多关于多处理有时会变慢的文章,我知道这与创建和管理新进程的开销有关。此外,当要完成的工作不够“大”时,多处理的效果可能不可见。但是在这种情况下,我认为这项工作相当大,而且 Pool.map() 版本似乎证明了这一点,因为它要快得多。

在管理所有这些进程并传递队列对象时,我做错了什么吗?如何优化这一点,以便在处理结果时将结果写入文件,以最大限度地减少运行时所需的内存量?

谢谢!

0 投票
1 回答
13151 浏览

python - AttributeError:“池”对象没有属性“__exit__”

我正在使用multiprocessing.Pool. 这些脚本如下所示:

当使用 Python 3.4 运行它时,一切都很好。但是,当使用 Python 2.63.1时,我收到此错误:

使用 Python 2.73.2,错误基本相同:

为什么会发生这种情况,我该如何规避这种情况?