【问题标题】:Proper way to end continuous Python process结束连续 Python 进程的正确方法
【发布时间】:2021-08-02 16:16:40
【问题描述】:

停止连续运行的 Python 进程的正确做法是什么?考虑以下代码:

from multiprocessing import Process

run_process = Process(target=self.run)

def start_running():
    run_process.start()

def run():
    while True:
        # Do stuff

def stop_running():
    # ???
    run_process.join()

我希望理想的情况是在调用 stop_running() 时让 run() 进程自行结束。一个想法是在 stop_running() 中发出信号量,该信号量在 run() 循环中进行检查,因此它知道要中断。但我想知道常见的做法是什么。

【问题讨论】:

    标签: multithreading multiprocessing python-multiprocessing


    【解决方案1】:

    在 Python 中没有“正确”的方式来做很多事情。由于您运行的是进程而不是线程,因此您有更多选择,这很好。

    如果您的进程没有完全卡住的风险,也没有卡在 IO 上无限期等待输入的风险(例如来自队列),我会使用信号量或变量来发出信号它现在应该退出的进程。

    如果存在进程卡在等待的风险,您可以通过run_process.kill()run_process.terminate() 将其解除。在 shell 中 kill 等于 kill -9 并保证完成工作。

    杀死/终止进程的缺点是,如果该进程拥有任何共享对象(队列、共享变量等),那么共享它们的其他进程也会损坏这些对象。丢弃它们是安全的,但如果您继续阅读它们,您可能会偶尔遇到难以调试的晦涩异常。

    所以一如既往。变量/信号量方法有其优势,但如果存在子进程陷入睡眠或等待且不检查条件的风险,您将一无所获。如果您的子进程不与其他进程共享任何资源,则 kill 可能更简单,并且是摆脱您的进程的有保证的方法。

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 2016-02-20
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多