【问题标题】:Can I run multiple Ipython qt console in the same time?我可以同时运行多个 Ipython qt 控制台吗?
【发布时间】:2014-04-27 18:32:24
【问题描述】:

这对于知道这一点的人来说应该非常简单,但我不是其中之一。我搜索了很多关于多处理的信息,但它让我更加困惑......

我需要独立处理大约 160 个数据文件。我有一些处理数据的函数,比如 f(arg1,arg2)。我电脑的CPU是i7-3770(4核8线程)。我想知道我是否可以同时打开 8 个 iptyhon qt 控制台来运行相同的函数(通过将函数复制到每个控制台),同时为 arg1 和 arg2 设置不同的值?

或者有没有一个非常简单的例子,通过在 python 中使用多处理来完成这样的任务?

我对编码知之甚少,我只是使用 pandas、numpy 和 scipy 来处理数据。我使用 Anaconda 作为我的 Python 环境。

非常感谢您的帮助!

【问题讨论】:

  • 检查multiprocessing 模块。特别要阅读pool of workers。您不必运行多个 qtconsole 来并行执行代码,只需使用 Pool.map
  • 谢谢,我知道我不必这样做,但可以吗?因为对我来说,这是最直接的方式......

标签: python multiprocessing ipython qtconsole


【解决方案1】:

multiprocessing 模块适用于此用例。

其用法的一个简单完整示例是:

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)

调用pool.map 将执行my_function,参数为1,然后是2 等,但并行执行。

注意my_function 只接受一个参数。如果你有一个函数f 接受n 参数,只需编写一个函数f_helper

def f_helper(args):
    f(*args)

并将参数打包成一个元组。例如:

results = pool.map(f_helper, [(1,2,3), (4,5,6), (7,8,9)])

相当于:

[f(1, 2, 3), f(4, 5, 6), f(7, 8, 9)]

但对f 的调用是并行执行的。


注意:由于代码将在不同的进程中运行,f 的任何副作用都不会被保留。例如,如果您修改原始参数,主进程将不会看到此更改。您必须认为参数已复制并传递给子进程,子进程计算结果再次复制到主进程中。

如果您尝试计算的函数花费的时间不够长,则复制参数和返回值可能需要 更多 时间,然后连续运行代码。


文档包含了各种examples模块的使用方法。

【讨论】:

  • 谢谢巴库留! f_helper函数我没看懂:如果原函数是f(x,y,z),这种情况下f_helper怎么写?抱歉,我对此知之甚少。
  • @user3576212 我写的f_helper 可以处理任何个参数。如果args 是一个元组,那么f(*args) 将调用f,并将元组的元素作为参数。 IE。 t = (1, 2, 3) 然后f(*t) == f(1, 2, 3)。另请参阅this 问题。 f_helper 有效地将 f 函数“转换”为一个接受单个参数而不是 n 的函数。
  • 嗨,又是我。我尝试了您编写的代码,但遇到了一些问题。我可以将最后一步修改为: if name == 'main': pool = multiprocessing.Pool() pool.map(last_helper, [(1980,1981), (1981,1982)]) ?因为我的函数不返回任何东西。但是当我使用这段代码时,它不起作用,内核一直很忙,但没有给我任何东西。
  • 我明白了,事实证明我无法在 ipython 或其他交互式解释器中运行它。如果我运行整个脚本,它就可以工作。知道如何在 ipython 中完成这项工作吗?
  • @user3576212 我可以在 qtconsole 中正常运行。请注意,如果您在 Windows 上,您必须放置if __name__ == '__main__' 保护。请参阅有关Windows 的建议。如果你不放那个守卫,你会得到一个无限循环。如果这对您没有帮助,您应该提供一个(可能是精简的)您正在运行的示例。
【解决方案2】:

我正在运行完全相同的代码:

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 控制台只是冻结了。

有什么解决办法吗?

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 2016-07-02
    • 2011-11-07
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多