python - 如何在 Python 中终止线程子进程调用和线程退出?
问题描述
我正在尝试在 Python 的线程中运行子进程 Popen。Popen 中的命令预计会连续运行以收集日志。但是当在线程外满足条件时,我想停止 Popen 子进程并且相应的线程也完成。下面是一个示例代表代码:
import threading
import subprocess
class MyClass(threading.Thread):
def __init__(self):
super(MyClass, self).__init__()
def run(self):
self.proc = subprocess.Popen("while true; do foo; sleep 2; done", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = self.proc.communicate()
myclass = MyClass()
myclass.start()
myclass.proc.kill()
print("Done")
但是在上面的代码中,它永远卡住了。停止正在运行的 Popen 子进程并完成线程的正确方法是什么?
解决方案
将参数添加 preexec_fn=os.setsid
到您的Popen
函数中。
用于os.killpg(proc.pid, signal.SIGKILL)
通过 pid 杀死子进程。
推荐阅读
- cuda - 有没有办法在奇数大小的数据数组上使用 CUB::BlockScan?
- python-3.x - 为变量分配第二天的时间
- javascript - 访问 XMLHttpRequest 已被 CORS 策略阻止 - 401(未经授权)
- r - 如何从 sparklyr 的 dplyr 实现返回的列表中循环不同的列结果?
- c - 如何通过重定向从文件中读取每一行?
- node.js - 如何将对象传递给 GET 请求?
- data-science - 为什么我们需要删除泰坦尼克号测试数据集中的“PassengerID”
- bash - 无法在 jq 中调用 bash 环境变量
- python - tensowflow中的分类器从标签大小返回错误
- python-3.x - 在 ImgGrab 中没有得到正确的宽度和高度