问题标签 [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 投票
1 回答
228 浏览

python - 无法终止子进程

我有这个代码:

问题是我无法在启动后终止进程。

我可以终止进程的唯一方法是运行kill <pid>.

如何终止该过程?

0 投票
1 回答
1233 浏览

python - NumPy 中的多处理

我已经在网上搜索了我的问题的任何解决方案,但还没有真正找到任何对我有帮助的东西。我的问题是我希望通过实现多处理来加速我的程序。该功能getSVJJPrice相当快。然而,K的大小约为 1000,使得整个代码非常慢。因此,我想知道是否有任何方法可以并行化for循环?代码在下面找到。

感谢任何对此进行调查的人!

最好的祝福,

胜利者

0 投票
2 回答
4941 浏览

python - 无法使用多处理 manager.dict() 共享对象实例

我在与multiprocessing. 我正在尝试使用 adict共享的 a manager,但是当我尝试将对象实例用作键时,它会被复制。

我了解解决此问题的方法是使用对象 ID 作为键,但为什么会发生这种情况?使用对象 ID 是解决我的问题的最佳方法吗?manager dict()我注意到普通的非对象不会发生这种情况。

替代方法

在 的文档中Manager(),我读到一些问题是通知服务器更改,所以我将代码更改为这个,但我的狗被复制而不是引用仍然存在同样的问题。

0 投票
1 回答
1749 浏览

python - 是否可以将可调用对象应用于进程池?

每当我调用函数Pool.apply_async时,我都必须传递一个由该进程运行的函数。我试图传递一个可调用的对象,但它什么也没做。有什么办法吗?还是我必须自己从头开始设计游泳池?

代码如下:

类似的东西。

0 投票
1 回答
2624 浏览

python - Python多处理没有产生预期的加速

我正在尝试使用 Python 的multiprocessing.Pool模块优化我的代码,但我没有得到我在逻辑上期望的加速结果。

我正在做的主要方法是计算大量向量和一个固定的大稀疏矩阵的矩阵向量乘积。下面是一个玩具示例,它执行我需要的,但使用随机矩阵。

30该方法在大约几秒钟内终止。

现在,由于每个元素的计算results不依赖于任何其他计算的结果,自然认为并行计算会加快进程。这个想法是创建 4 个进程,如果每个进程都进行一些计算,那么完成所有进程所需的时间应该减少大约4. 为此,我编写了以下代码:

我的问题是这段代码的运行时间略高于20几秒钟,所以我什至没有将性能提高一倍2!更糟糕的是,即使池中包含进程,性能也没有提高!8知道为什么没有发生加速吗?


注意:我的实际方法需要更长的时间,并且输入向量存储在一个文件中。如果我将文件分成4几部分,然后在单独的进程中手动为每个文件运行我的脚本,则每个进程的终止速度是整个文件的四倍(如预期的那样)。我很困惑为什么这种加速(这显然是可能的)没有发生multiprocessing.Pool


Edi:我刚刚发现Multiprocessing.Pool 使 Numpy 矩阵乘法变慢了这个问题,这可能是相关的。不过,我必须检查一下。

0 投票
1 回答
776 浏览

python - 使用 multiprocessing.Queue 的交错数据加载有时会导致项目被乱序消耗

我正在编写一个动画图像数据的脚本。我有许多大型图像立方体(3D 阵列)。对于其中的每一个,我会逐步浏览每个立方体中的框架,一旦接近它的尽头,我就会加载下一个立方体并继续。由于每个立方体的尺寸很大,因此加载时间很长(~5s)。我希望动画在多维数据集之间无缝过渡(同时也节省内存),所以我错开加载过程。我在解决方案方面取得了一些进展,但一些问题仍然存在。

下面的代码加载每个数据立方体,将其拆分为帧并将它们放入multiprocessing.Queue. 一旦队列中的帧数低于某个阈值,就会触发下一个加载过程,该过程会加载另一个多维数据集并将其解包到队列中。

查看下面的代码:

这在某些情况下非常有效,但有时在触发新的加载过程后数据的顺序会变得混乱。我不知道为什么会发生这种情况 - mp.Queue 应该是 FIFO 对吧?!例如。运行上面的代码不会保留输出队列中的正确顺序,但是,将阈值更改为较低的值,例如。30 解决了这个问题。*如此迷茫...

所以问题:如何multiprocessing在python中正确实现这种交错加载策略?

0 投票
1 回答
7089 浏览

python - python 进程在等待信号量时收到 SIGTERM 后如何优雅退出?

我有一个 Python 进程,它使用多处理模块生成 5 个其他 Python 进程。我们称父进程为 P0,其他进程为 P1-P5。要求是,如果我们向 P0 发送 SIGTERM,它应该先关闭 P1 到 P5,然后自行退出。

问题是 P1 和 P5 正在等待信号量。因此,当我向这些进程发送 SIGTERM 时,它们会调用信号处理程序并退出。但是由于他们正在等待信号量,所以他们抛出了一个异常。有什么方法可以在退出之前捕获该异常,以便 P0 到 P5 可以优雅地退出?

追溯:

0 投票
1 回答
380 浏览

python - 关闭 wxPython 窗口时 Python 看门狗没有终止

我有一个应用程序,其中包含一个 wxPython GUI,它在初始化时启动一个看门狗观察器和一个 python 进程。

我正在通过这个 wx.TaskBarIcon 回调方法关闭 wxPython 窗口:

其中 DestroyChildProcess 是:

请注意,BacklogManager 是一个多处理 Process 子类。我遇到的问题是,当我关闭 wxPython GUI 窗口时,我仍然在 Windows 任务管理器中看到两个 pythonw.exe 进程。有三种可能:

  1. 我没有正确终止 GUI 进程。(不确定是否是进程)
  2. 我没有正确终止看门狗观察者。
  3. 我没有正确终止 backlog_manager 进程。

从玩弄代码来看,调用“self.backlog_manager.terminate()”似乎确实工作正常,留下一个 pythonw.exe 实例运行。

有没有办法让我正确终止或停止所有 pythonw.exe 进程?我究竟做错了什么?

编辑 - 经过进一步调查,这似乎是我用来启动 python 脚本的 .bat 脚本的问题。我本质上是使用 pythonw.exe 和 START /B 来隐藏命令行窗口。

似乎当我使用以下内容启动脚本时:

当我关闭命令行窗口时,所有 Windows 任务管理器进程都会结束。我怀疑这可能是 pythonw.exe 或我结束进程的方式的问题。

0 投票
2 回答
554 浏览

python - Wrap Multiprocess Pool Inside Loop(进程间共享内存)

我正在使用 Python 包“deap”来解决一些遗传算法的多目标优化问题。这些功能可能非常昂贵,并且由于 GA 的进化性质,它很快就会变得复杂。现在这个包确实有一些支持允许进化计算与多进程并行化。

但是,我想更进一步并多次运行优化,在某些优化参数上使用不同的值。例如,我可能想用不同的权重值来解决优化问题。

这对于循环来说似乎是一个很自然的情况,但问题是这些参数必须在程序的全局范围内定义(即,在“main”函数之上),以便所有子进程都知道这些参数。这是一些伪代码:

我研究了各种可能性,例如 multiprocessing.Value、多处理的 pathos fork 等,但最终读取 Individual 类的子进程总是存在问题。

我已经在 deap 用户组上提出了这个问题,但它不像 SO 那样大。另外,在我看来,这更像是一个通用的概念性 Python 问题,而不是 deap 的特定问题。我目前对这个问题的解决方案只是多次运行代码并每次更改一些参数定义。至少这样 GA 计算仍然是并行的,但它确实需要比我想要的更多的手动干预。

任何意见或建议将不胜感激!

0 投票
1 回答
367 浏览

python - Python3 & Opencv3 & Multiprocessing 引发系统错误

我目前正在使用 OpenCV 3 和 python 3.4。我的机器是一台装有 OS X 10.10 (Yosemite) 的 MacBook Pro,我在使用 OpenCV 中的一些函数和多处理库时遇到了问题。这是重现错误的(非常)简化的示例代码:

问题是它永远不会到达“完成!!” 打印,因为它中断显示 OS X 错误消息。完整的错误信息在这个GIST中

我已经被这个问题困扰了一段时间,并且无法找到这个错误的确切原因。如果我不运行“cvtcolor”命令,就完全没有问题。以及如果“grabcut”命令没有运行......

UDATE: 在 _func 方法中,如果我添加打印或创建文件作为打印和创建的第一条指令,这意味着进程已启动。执行抓取(在段函数中)和 cvtcolor 时会出现问题。如果其中之一没有执行,则根本没有问题。它怎么可能有关联?

我也尝试过使用multiprocessing.dummy.Process,它奏效了。OpenCV可能有问题吗?