Python中如何根据特定状态来终止Process进程?
创建了某个进程(process1):
process1 = multiprocessing.Process(target=xx,args(xx,))
这个进程只会因为外界的某个'状态'改变而终止,请问如何实现?
Python中如何根据特定状态来终止Process进程?
signal
import multiprocessing
import time
import signal
def worker(stop_flag, shared_value):
"""工作进程函数"""
while not stop_flag.value:
# 模拟工作
with shared_value.get_lock():
shared_value.value += 1
print(f"Process working, value: {shared_value.value}")
time.sleep(1)
print("Process terminated gracefully")
def monitor_process(proc, stop_flag, shared_value, threshold=5):
"""监控进程状态并决定是否终止"""
while proc.is_alive():
time.sleep(0.5)
# 检查条件:当共享值达到阈值时终止
if shared_value.value >= threshold:
print(f"Threshold reached ({shared_value.value}), stopping process...")
stop_flag.value = True
proc.join(timeout=2) # 等待进程优雅退出
if proc.is_alive():
proc.terminate() # 强制终止
break
if __name__ == "__main__":
# 使用共享变量作为停止标志
stop_flag = multiprocessing.Value('b', False)
shared_value = multiprocessing.Value('i', 0)
# 创建并启动工作进程
p = multiprocessing.Process(target=worker, args=(stop_flag, shared_value))
p.start()
# 启动监控
monitor_process(p, stop_flag, shared_value, threshold=5)
print("Main process done")
核心方法:
-
共享变量标志位:用
multiprocessing.Value创建进程间共享的停止标志,工作进程定期检查这个标志。 -
Process.terminate():强制终止进程(类似SIGTERM),但可能导致资源未释放。
-
Process.join(timeout):等待进程结束,可设置超时时间。
-
优雅终止模式:
- 设置共享停止标志
- 工作进程检测到标志后自行清理退出
- 主进程用
join()等待 - 超时后用
terminate()强制结束
关键点:
- 用
if __name__ == "__main__":保护主进程代码 - 共享变量访问需要加锁(
with shared_value.get_lock():) - 优先使用优雅终止,避免强制终止导致资源泄漏
一句话建议:用共享变量做停止标志,结合join和terminate实现可控终止。
Unix signal, FIFO pipe, socket
感谢楼上两位,正在查资料,如果方便的话希望可以给个简单的 demo 阅读下…谢谢
- 这个状态是在进程内部获取的还是在外部获取的?
- 获取这个状态后,是希望外部终止进程还是进程自动退出?
test 我是黑号了?
- 这个状态是在进程内部获取的还是在外部获取的?
:通过外部获取某个状态
- 获取这个状态后,是希望外部终止进程还是进程自动退出?
:关于这点,我不太清楚两者区别,对我来讲只要进程被杀掉就好了,如果方便可以解释下吗?
第二个问题是,这个进程的程序是你写的吗?
那就简单了
if 外部状态:
process1.terminate()
收工
是的,需要 主程序 负责控制这些进程的创建和销毁,通过在主程序中改变某个"状态"来达到某个进程被销毁的效果.
是个比较简单的好办法,谢谢,用这个似乎就不用在通过信号来销毁进程了
我猜 process.terminate 发了 SIGTERM
啊恕我多嘴…我只是说底下还是发了 SIGTERM,不过光用并不需要了解信号…
第一次接触多线程 /多进程 编程,头很大,我明白你的意思,看了下 terminate()方法的介绍,最后还是要信号发送 SIGTERM,谢谢哈
大概是了解你第二个问题的意思了,果然还是要通过发送信号来终止,因为要在进程内获取"状态"来判断是否退出进程,外部的主程序只负责改变"状态",不关心这个进程,感谢,应该是只要如何实现了
kill -l 查下
SIGTERM 默认的行为是结束程序,所以如果你只是想暴力的结束进程的话并不需要另外做什么,不然的话你可以在收到 SIGTERM 或者其他信号例如 SIGINT 的时候保存 /清理数据
python3 多进程:处理指定个数任务,完成一个 count 一次,检测完成==总任务,后自动退出。
有需求可以看看: https://github.com/barrer/scan-helper/blob/master/scan_helper_png.py

