Я хочу, чтобы сценарий запустил новый процесс, такой, что новый процесс продолжает бежать за начальными выходами сценария. Я ожидал, что мог использовать multiprocessing.Process
запустить новый процесс и установить daemon=True
так, чтобы основной сценарий мог выйти, в то время как созданный процесс продолжает работать.
Но кажется, что второй процесс тихо завершается, когда основной сценарий выходит. Это - ожидаемое поведение, или я делаю что-то не так?
Из документации Python:
Когда процесс завершается, он пытается прекратить все его демонические дочерние элементы процессы.
Это ожидаемое поведение.
Просто используйте модуль подпроцесса
:
import subprocess
subprocess.Popen(["sleep", "60"])
Вот связанный с этим вопрос по SO, один из ответов которого дает хорошее решение этой проблемы:
Если вы работаете в системе 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