Запуск отдельного процесса

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

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

15
задан tshepang 14 August 2012 в 11:04
поделиться

4 ответа

Из документации Python:

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

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

14
ответ дан 1 December 2019 в 01:38
поделиться

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

import subprocess
subprocess.Popen(["sleep", "60"])
8
ответ дан 1 December 2019 в 01:38
поделиться

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

«процесс порождения из python»

1
ответ дан 1 December 2019 в 01:38
поделиться

Если вы работаете в системе 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
11
ответ дан 1 December 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: