【问题标题】:Multiprocessing working in Python but not in iPython多处理在 Python 中工作,但不在 iPython 中
【发布时间】:2014-07-01 17:32:10
【问题描述】:

我在 iPython 中运行以下代码:

import multiprocessing

def my_function(x):
    """The function you want to compute in parallel."""
    x += 1
    return x


if __name__ == '__main__':
    pool = multiprocessing.Pool()
    results = pool.map(my_function, [1,2,3,4,5,6])
    print(results)

在 Windows 上的 ipython QT 控制台中。但是,代码不起作用——QT 控制台只是冻结了。这个问题是 iPython 特有的(上面的代码应该适用于常规的 Python 2.7)。

有什么解决办法吗?

【问题讨论】:

  • 在 Ubuntu 上运行良好。应该是windows的问题。您是否将代码粘贴到 Ipython 中?
  • 是的,我确实粘贴了代码。
  • 从另一个 shell 或 IDE 运行它是否有效?
  • 是的,我刚刚在 Spyder IDLE 中尝试过。它在那里工作。知道如何让它在实际的 QT 控制台中工作吗?
  • 我赞同@PadraicCunningham 的评论。在 Linux 发行版上运行良好(我使用的是 Debian)。

标签: python qt multiprocessing ipython


【解决方案1】:

来自documentation

注意

此包中的功能要求 __main__ 模块是 孩子们可以导入。这在编程指南中有介绍 但是值得在这里指出。 这意味着一些例子, 比如 multiprocessing.Pool 的例子在 交互式解释器

【讨论】:

  • 您是在 QT 控制台中复制/粘贴代码,还是进行其他操作?
【解决方案2】:

至少在当前版本的 Jupyter Notebook(IPython 的继任者)中,您可以通过将目标函数移动到单独的模块并导入它来解决此问题。

我不知道为什么会这样,这很奇怪,但确实如此。

即- 在workers.py 文件中放置

def my_function(x):
    """The function you want to compute in parallel."""
    x += 1
    return x

然后在 IPython/Jupyter notebook 中放:

import multiprocessing
import workers

pool = multiprocessing.Pool()
results = pool.map(workers.my_function, [1,2,3,4,5,6])
print(results)

另外 - 似乎不需要 if-main 东西。

Credit: Gaurav Singhal

【讨论】:

  • 这可行,但性能似乎没有提高,因为它看起来仍然在单个进程/线程中运行。
  • @JohnZhang 当我运行它时,我得到了不同的进程 ID(尽管有时我得到了相同的进程)。您可以将 os.getpid() 添加到 worker.py (确保导入 os)。
  • 在我的测试中,如果我在 Python 控制台中运行它,我会得到 MP。但是,如果我在 Jupyter 中运行它,它将始终是 1 个进程。我认为这是有道理的,因为一个 Jupyter notebook 是 Jupyter 架构中的一个进程(至少在 Windows 上)。
  • @JohnZhang 你用过泳池吗?我也使用windows,我确实得到了多处理。这也没有意义,因为您使用的每个 IDE 甚至控制台都是一个进程,并且它们都会产生不同的进程。
猜你喜欢
  • 2011-02-27
  • 2017-05-13
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 2012-04-14
相关资源
最近更新 更多