我想要一個腳本來啓動一個新進程,以便新進程在初始腳本退出後繼續運行。我預計我可以使用multiprocessing.Process
開始一個新進程,並設置daemon=True
,以便主腳本可以在創建的進程繼續運行時退出。開始一個單獨的過程
但是,當主腳本退出時,似乎第二個進程已悄悄終止。這是預期的行爲,還是我做錯了什麼?
我想要一個腳本來啓動一個新進程,以便新進程在初始腳本退出後繼續運行。我預計我可以使用multiprocessing.Process
開始一個新進程,並設置daemon=True
,以便主腳本可以在創建的進程繼續運行時退出。開始一個單獨的過程
但是,當主腳本退出時,似乎第二個進程已悄悄終止。這是預期的行爲,還是我做錯了什麼?
從Python文檔:
當一個進程退出時,它會嘗試 終止其所有惡魔的孩子 過程。
這是預期的行爲。
如果你是在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
殺死父進程:
恢復script.py前臺:
% fg
script.py
Terminated
您會看到子進程仍在運行:
% I'm just a child
I'm just a child
I'm just a child
...
殺子(在一個新的終端)與
% kill 6827
「你可以殺死父母而不殺死孩子。」怎麼樣? – 2017-08-21 19:00:39
@MartinThoma:我在上面的終端添加了如何做到這一點的細節。許多操作系統都有一個GUI過程監視器,可以使這變得更加容易,但這些細節將是OS/GUI特定的。 – unutbu 2017-08-21 19:15:45
這裏是SO,其中一個答案給出了一個很好的解決這個問題的一個相關的問題:
簡單使用subprocess
模塊:
import subprocess
subprocess.Popen(["sleep", "60"])
謝謝,顯然我沒有RTFM足夠接近。 – JacquesB 2010-06-13 16:11:39