0

如何并行启动多个计算,同时在第一个返回时将它们全部停止?

我想到的应用如下:计算某个值有多种方法;每种方法所花费的时间取决于函数参数;通过并行启动计算,每次都会自动“选择”最快的计算,并停止其他计算。

现在,有一些“细节”让这个问题变得更加困难:

  • 要计算的函数的参数包括函数(从数据点计算;它们不是顶级模块函数)。实际上,计算是两个函数的卷积。我不确定如何将此类函数参数传递给子进程(它们不可选择)。
  • 我无法访问所有计算代码:一些计算是由 Scipy 在内部完成的(可能通过 Fortran 或 C 代码)。我不确定线程​​是否提供类似于可以发送到进程的终止信号的东西。

这是Python可以相对轻松地完成的事情吗?

4

3 回答 3

1

multiprocessing如果您还没有,我会查看该模块。它提供了一种将任务卸载到单独进程的方法,同时为您提供简单的threading类似界面。

它提供了与您在模块中获得的相同类型的原语threading,例如,用于在任务之间传递消息的工作池和队列,但它允许您回避 GIL 的问题,因为您的任务实际上在单独的进程中运行。

你想要的实际语义是非常具体的,所以我认为没有一个开箱即用的例程,但你肯定可以敲一个。

注意:如果要传递函数,它们不能绑定函数,因为这些函数不可腌制,这是在任务之间共享数据的要求。

于 2010-01-20T15:00:34.257 回答
0

由于全局解释器锁定,您将很难以这种方式获得任何加速。实际上,即使是 Python 中的多线程程序也只能在一个内核上运行。因此,您只需以 1/N 倍的速度执行 N 个进程。即使一个完成的时间是其他人的一半,你仍然会在大局中浪费时间。

于 2010-01-20T14:59:24.837 回答
0

进程可以很容易地启动和终止。

你可以这样做。

import subprocess
watch = []
for s in ( "process1.py", "process2.py", "process3.py" ):
    sp = subprocess.Popen( s )
    watch.append( sp )

现在你只是在等待其中一个完成。当一个完成时,杀死其他人。

import time
winner= None
while winner is None:
    time.sleep(10)
    for w in watch:
        if w.poll() is not None:
            winner= w
            break
for w in watch:
    if w.poll() is None: w.kill()

这些是进程——不是线程。没有 GIL 考虑。让操作系统调度它们;这就是它最擅长的。

此外,每个过程只是一个脚本,它使用您的一种替代算法简单地解决问题。它们是完全独立且独立的。易于设计、构建和测试。

于 2010-01-20T15:26:29.893 回答