0

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

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

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

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

非常感谢您的帮助!

4

2 回答 2

3

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.mapmy_function使用参数1,然后2等但并行执行。

请注意,my_function它只接受一个参数。如果您有一个带参数的函数fn只需编写一个函数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:由于代码将在不同的进程中运行,因此不会保留任何副作用。例如,如果您修改原始参数,主进程将不会看到此更改。您必须认为参数被复制并传递给子进程,子进程计算结果,该结果再次复制到主进程中。

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


该文档包含模块使用的各种示例

于 2014-04-27T19:26:07.877 回答
0

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

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

有什么解决办法吗?

于 2014-05-06T15:04:47.943 回答