为什么这个叉子没有进入后台呢?

时间:2014-02-10 03:09:04

标签: python background-process

我想分叉到后台运行一个长时间运行的函数,父项立即退出。我无法使用os.fork(),因为我需要Windows支持。这就是我想出的:

#!/usr/bin/env python3

import multiprocessing
import time

def long_running_function(timeout=30):
    time.sleep(timeout)

if __name__ == '__main__':
    multiprocessing.Process(target=long_running_function).start()

生成子进程:ps显示两个具有相同命令字符串的Python进程。但是,在我试用它的Mac和Windows机器上,它就好像我在join()上调用了Process:父母和孩子一直在运行,如果我做 ctrl - c ,都死了。我做错了什么?

1 个答案:

答案 0 :(得分:-3)

开始多处理Process可以fork,但不是必需的。进程使用与Threading类似的API,它不会导致从OS调用fork()API。在Python中,一个简单的fork示例是:

#!/usr/bin/env python

"""A basic fork in action"""

import os

def my_fork():
    child_pid = os.fork()
    if child_pid == 0:
        print "Child Process: PID# %s" % os.getpid()
    else:
        print "Parent Process: PID# %s" % os.getpid()

if __name__ == "__main__":
    my_fork()

注意我们如何导入os库。在您的示例中,您不会导致fork()永远不会被调用。

请注意,在Windows上,fork()不存在,因此您无法在* nix系统上进行分叉。

请参阅HERE以获取解释Python中分叉的好文章。