结束连续 Python 过程的正确方法

Proper way to end continuous Python process

停止连续 运行ning 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() 时让 运行() 进程自行结束。一个想法是在 stop_running() 中发出一个信号量,它在 运行() 循环中被检查,所以它知道中断。但我想知道常见的做法是什么。

Python 中的大部分事情都没有“正确”的方法来做。因为你是 运行 进程而不是线程,你有更多的选择,这很好。

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

如果有进程卡在wait中的风险,可以通过run_process.kill()run_process.terminate()解除。 Kill 等于 shell 中的 kill -9,保证完成任务。

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

所以一如既往地取决于。 variable/semaphore 方法有其优点,但如果存在子进程卡在睡眠或等待状态且不检查条件的风险,您将无法实现任何目标。如果您的子进程不与其他进程共享任何资源,则 kill 可能更简单并且是摆脱进程的可靠方法。