Начиная отдельный процесс - PullRequest
14 голосов
/ 13 июня 2010

Я хочу, чтобы скрипт запускал новый процесс, чтобы новый процесс продолжал выполняться после выхода из исходного скрипта. Я ожидал, что смогу использовать multiprocessing.Process для запуска нового процесса и установить daemon=True, чтобы основной сценарий мог завершиться, пока созданный процесс продолжает работать.

Но похоже, что второй процесс молча завершается при выходе из основного сценария. Это ожидаемое поведение, или я делаю что-то не так?

Ответы [ 5 ]

14 голосов
/ 13 июня 2010

Из документов Python:

Когда процесс завершается, он пытается завершить все свои демонические дочерние процессы.

Это ожидаемое поведение.

10 голосов
/ 13 июня 2010

Если вы работаете в системе 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

Найдите идентификационный номер процесса для родителя.Это будет меньшее из двух номеров идентификаторов процесса, так как родительский процесс пришел первым:

% 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
8 голосов
/ 13 июня 2010

Просто используйте модуль subprocess:

import subprocess
subprocess.Popen(["sleep", "60"])
1 голос
/ 13 июня 2010

Вот связанный вопрос по SO, где один из ответов дает хорошее решение этой проблемы:

"процесс порождения из питона"

0 голосов
/ 25 апреля 2018

Если вы работаете в Unix-системе ( с использованием документов ):

#!/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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...