【问题标题】:Python create a subprocess and do not waitPython创建一个子进程,不要等待
【发布时间】:2017-01-06 11:40:46
【问题描述】:

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

我看了

os.fork()

subprocess.popen()

不要以为那是我需要的。

代码

def command1():
   wait(10)

def command2():
   wait(10)

def command3():
   wait(10)

我想打电话

command1()
command2()
command3()

无需等待。

【问题讨论】:

  • 如果你使用 Python 3.4+,你可以使用asyncio subprocess
  • 如果你的命令是python函数,你可以考虑线程:docs.python.org/2/library/threading.html。这也取决于您所说的“我不想等待”
  • 嗯...只是删除“等待”...对不起。 :) 你看过multiprocessing 吗?您可以为每个命令启动一个进程。默认文档很好地解释了这一点。
  • @z0rberg 的哈哈哈哈!但这将包括执行“外部”python 脚本对吗?
  • @doomyster 谢谢 - 看看。我的意思是,我只想开始执行该方法并继续。

标签: python subprocess fork


【解决方案1】:

使用 python 的多处理模块。

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

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

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

编辑:

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

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

【讨论】:

  • 你应该修正/澄清你关于 GIL 的句子。
【解决方案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 用于您的功能。

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

【讨论】:

  • 这是一个很好的例子,但它实际上只是开始重新发明 Python 的多处理功能的轮子——如果你打开它的文档,你会发现有很多东西使其正常工作。从os.fork 在 Windows 平台上不起作用这一事实开始。
  • 但是,是的,你有一个非常好的和简单的例子。还是谢谢。
  • 我知道多处理模块。它提供的只有一个是跨平台的。作者确切地询问了在调用时间内以最少的语法启动函数。这种方式给它。有可能在do_fork() 中编写带有multiprocessing 功能的代码,而且我同意这更好。但我的想法是使用装饰器来实现轻量级语法,它不是os.fork()multiprocess.Process()
【解决方案3】:

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

from multiprocessing import Process

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

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

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

现在,请注意仍然存在一些特殊性 - 例如,特别是当您从网络请求中调用它们时。几天前检查这个问题的答案表格: Stop a background process in flask without creating zombie processes

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    相关资源
    最近更新 更多