Python创建一个子进程,不要等待

时间:2017-01-06 11:40:46

标签: python subprocess fork

我想运行一系列命令(需要很长时间)。但我不想等待每个命令的完成。我怎样才能在Python中解决这个问题?

我看了

os.fork()

subprocess.popen()

不要认为这就是我的需要。

代码

def command1():
   wait(10)

def command2():
   wait(10)

def command3():
   wait(10)

我想致电

command1()
command2()
command3()

无需等待。

3 个答案:

答案 0 :(得分:2)

最直接的方法是使用Python自己的multiprocessing

from multiprocessing import Process

def command1():
   wait(10)
...

call1 = Process(target=command1, args=(...))
call1.start()
...

这个模块的引入完全是为了减轻控制在同一代码库中可访问的函数的外部进程执行的负担。当然,这可以通过使用os.fork,subprocess来完成。多处理尽可能模仿Python自己的threading模块接口。使用多处理优于线程的一个直接优势是,这使得各种工作进程能够利用不同的CPU内核,实际上并行工作 - 而有线的,由于语言设计限制实际上仅限于单个执行工作者因此,即使有几个核心可用,也可以使用单个核心。

现在,请注意仍然存在一些特殊情况 - 例如,如果您是在Web请求中调用这些特性的话。几天前检查这个问题的答案: Stop a background process in flask without creating zombie processes

答案 1 :(得分:2)

使用python的多处理模块。

def func(arg1):
    ... do something ...

from multiprocessing import Process
p = Process(target=func, args=(arg1,), name='func')
p.start()

完整的Documentaion就在这里:https://docs.python.org/2/library/multiprocessing.html

编辑:

如果你使用jpython / cpython发行版,你也可以使用python的Threading模块,因为你可以克服这些发行版中的GIL(全局解释器锁)。

https://docs.python.org/2/library/threading.html

答案 2 :(得分:2)

这个例子可能适合你:

#!/usr/bin/env python3

import sys
import os
import time

def forked(fork_func):
    def do_fork():
        pid = os.fork()
        if (pid > 0): 
            fork_func()
            exit(0)
        else:
            return pid
    return do_fork

@forked
def command1():
    time.sleep(2)

@forked
def command2():
    time.sleep(1)

command1()
command2()
print("Hello")

您只需使用装饰器@forked来完成您的功能。

只有一个问题:当主程序结束时,它等待子进程结束。