Python中如何根据特定状态来终止Process进程?

创建了某个进程(process1):

process1 = multiprocessing.Process(target=xx,args(xx,))

这个进程只会因为外界的某个'状态'改变而终止,请问如何实现?


Python中如何根据特定状态来终止Process进程?
18 回复

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")

核心方法:

  1. 共享变量标志位:用multiprocessing.Value创建进程间共享的停止标志,工作进程定期检查这个标志。

  2. Process.terminate():强制终止进程(类似SIGTERM),但可能导致资源未释放。

  3. Process.join(timeout):等待进程结束,可设置超时时间。

  4. 优雅终止模式

    • 设置共享停止标志
    • 工作进程检测到标志后自行清理退出
    • 主进程用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

回到顶部