代码之家  ›  专栏  ›  技术社区  ›  Eric O. Lebigot

如何并行启动多个计算,同时在第一个计算返回时停止所有计算?[蟒蛇]

  •  0
  • Eric O. Lebigot  · 技术社区  · 15 年前

    如何并行启动多个计算,同时在第一个计算返回时停止所有计算?

    我想到的应用程序是:有多种方法计算某个值;根据函数参数,每个方法需要不同的时间;通过并行启动计算,每次自动“选择”最快的计算,其他计算将停止。

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

    • 要计算的函数的参数包括 功能 (根据数据点计算;它们不是顶级模块功能)。实际上,计算是两个函数的卷积。我不知道如何将这些函数参数传递给子进程(它们不可拾取)。
    • 我不能访问所有的计算代码:有些计算是由scipy内部完成的(可能是通过fortran或c代码)。我不确定线程是否提供类似于可以发送到进程的终止信号的东西。

    这是Python相对容易做到的吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   jkp    15 年前

    我会看看 multiprocessing 模块,如果你还没有。它提供了一种将任务卸载到单独流程的方法,同时为您提供了一个简单的 threading 喜欢界面。

    它提供了与您进入 螺纹加工 例如,模块,用于在任务之间传递消息的工作池和队列,但它允许您回避GIL的问题,因为您的任务实际上是在单独的进程中运行的。

    你想要的东西的实际语义非常具体,所以我认为没有一个程序可以满足你的要求,但是你肯定能做到。

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

        2
  •  0
  •   Pace    15 年前

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

        3
  •  0
  •   S.Lott    15 年前

    进程可以启动和终止,这是微不足道的。

    你可以这样做。

    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()
    

    这些是进程,而不是线程。没有吉尔的考虑。让操作系统对它们进行调度;这是它最有效的方法。

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