我想 fork 到后台运行一个长时间运行的函数,父函数立即退出。我不能使用 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 机器上,它的行为就好像我在 Process 上调用了 join():父子进程都继续运行,如果我执行 ctrl-c,两者都会死亡。我做错了什么?
请您参考如下方法:
要启动多处理过程可以 fork ,但不是必需的。 Process 使用与 Threading 类似的 API,它不会导致操作系统调用 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 系统上那样进行 fork 。
请参阅HERE一篇解释 Python fork 的好文章。
