开始一个单独的过程

时间:2010-06-13 15:41:52

标签: python multiprocessing

我希望脚本启动一个新进程,以便在初始脚本退出后新进程继续运行。我希望我可以使用multiprocessing.Process来启动一个新进程,并设置daemon=True,以便在创建的进程继续运行时主脚本可以退出。

但似乎第二个进程在主脚本退出时以静默方式终止。这是预期的行为,还是我做错了什么?

5 个答案:

答案 0 :(得分:14)

来自Python文档:

  

当进程退出时,它会尝试   终止其所有守护儿童   过程

这是预期的行为。

答案 1 :(得分:10)

如果您使用的是unix系统,则可以使用os.fork

import os
import time

pid=os.fork()
if pid:
    # parent
    while True:
        print("I'm the parent")
        time.sleep(0.5)    
else:
    # child
    while True:
        print("I'm just a child")
        time.sleep(0.5)

运行此操作会创建两个进程。您可以在不杀死孩子的情况下杀死父母。 例如,当您运行脚本时,您将看到如下内容:

% script.py
I'm the parent
I'm just a child
I'm the parent
I'm just a child
...

使用ctrl-Z停止脚本:

^Z
[1]+  Stopped                 script.py

查找父级的进程ID号。它将是两个进程ID号中较小的一个,因为父对象是第一个:

% ps axuw | grep script.py
unutbu    6826  0.1  0.1  33792  6388 pts/24   T    15:09   0:00 python /home/unutbu/pybin/script.py
unutbu    6827  0.0  0.1  33792  4352 pts/24   T    15:09   0:00 python /home/unutbu/pybin/script.py
unutbu    6832  0.0  0.0  17472   952 pts/24   S+   15:09   0:00 grep --color=auto script.py

杀死父进程:

% kill 6826

将script.py恢复到前台:

% fg
script.py
Terminated

您将看到子进程仍在运行:

% I'm just a child
I'm just a child
I'm just a child
...

杀死孩子(在新的终端)
% kill 6827

答案 2 :(得分:8)

只需使用subprocess模块:

import subprocess
subprocess.Popen(["sleep", "60"])

答案 3 :(得分:1)

这是一个关于SO的相关问题,其中一个答案为这个问题提供了一个很好的解决方案:

"spawning process from python"

答案 4 :(得分:0)

如果您使用的是unix系统(using docs):

#!/usr/bin/env python3
import os
import sys
import time
import subprocess
import multiprocessing
from multiprocessing import Process

def to_use_in_separate_process(*args):
    print(args)

    #check args before using them:
    if len(args)>1:
        subprocess.call((args[0], args[1]))
        print('subprocess called')

def main(apathtofile):
    print('checking os')
    if os.name == 'posix':
        print('os is posix')
        multiprocessing.get_context('fork')
        p = Process(target=to_use_in_separate_process, args=('xdg-open', apathtofile))
        p.run()
    print('exiting def main')

if __name__ == '__main__':
    #parameter [1] must be some file that can be opened by xdg-open that this
    #program uses.
    if len(sys.argv)>1:
        main(sys.argv[1])
        print('we can exit now.')
    else:
        print('no parameters...')
    print('mother program will end now!')
    sys.exit(0)