gpt4 book ai didi

python - 终止程序退出时在线程中运行的子进程

转载 作者:行者123 更新时间:2023-12-03 13:09:22 24 4
gpt4 key购买 nike

基于对这个问题的公认答案:python-subprocess-callback-when-cmd-exits我正在一个单独的线程中运行一个子进程,并且在该子进程完成之后,将执行一个可调用对象。一切都很好,但是问题在于,即使将线程作为守护程序运行,即使程序正常退出或被kill -9,Ctrl + C等杀死,子进程仍会继续运行。

下面是一个非常简化的示例(在2.7上运行):

import threading
import subprocess
import time
import sys


def on_exit(pid):
print 'Process with pid %s ended' % pid

def popen_with_callback(cmd):

def run_in_thread(command):
proc = subprocess.Popen(
command,
shell=False
)
proc.wait()
on_exit(proc.pid)
return

thread = threading.Thread(target=run_in_thread, args=([cmd]))
thread.daemon = True
thread.start()
return thread

if __name__ == '__main__':
popen_with_callback(
[
"bash",
"-c",
"for ((i=0;i<%s;i=i+1)); do echo $i; sleep 1; done" % sys.argv[1]
])
time.sleep(5)
print 'program ended'

如果主线程的持续时间比子进程的持续时间长,那么一切都很好:
(venv)~/Desktop|➤➤ python testing_threads.py 3
> 0
> 1
> 2
> Process with pid 26303 ended
> program ended

如果主线程的持续时间少于子进程,则子进程将继续运行,直到最终挂起:
(venv)~/Desktop|➤➤ python testing_threads.py 8
> 0
> 1
> 2
> 3
> 4
> program ended
(venv)~/Desktop|➤➤ 5
> 6
> 7
# hanging from now on

如果主程序完成或终止,如何终止子进程?我尝试在 atexit.register(os.kill(proc.pid, signal.SIGTERM))之前使用 proc.wait,但是它实际上在运行子进程的线程退出时执行,而不是在 线程退出时执行。

我也在考虑轮询父pid,但是由于 proc.wait的情况,我不确定如何实现它。

理想的结果是:
(venv)~/Desktop|➤➤ python testing_threads.py 8
> 0
> 1
> 2
> 3
> 4
> program ended
> Process with pid 1234 ended

最佳答案

使用Thread.join方法,该方法将阻塞主线程,直到该线程退出:

if __name__ == '__main__':
popen_with_callback(
[
"bash",
"-c",
"for ((i=0;i<%s;i=i+1)); do echo $i; sleep 1; done" % sys.argv[1]
]).join()
print 'program ended'

关于python - 终止程序退出时在线程中运行的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40995102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com