繁体   English   中英

如何从主进程使用KeyboardInterrupt停止子进程?

[英]How to use KeyboardInterrupt from the main process to stop child processes?

运行以下代码,然后执行Ctrl+C可以使p1p2p3p4在后台运行(其中Ctrl+C不执行任何操作)。

如何从主进程中使用KeyboardInterrupt ,使其也停止所有子进程?

import time
from multiprocessing import Process


def process(proc_n):
    while True:
        try:
            pass
        except KeyboardInterrupt:
            break
        except Exception as e:
            print(e)
        time.sleep(0.5)


def main():
    p1 = Process(target=process, args=(1,))
    p2 = Process(target=process, args=(2,))
    p3 = Process(target=process, args=(3,))
    p4 = Process(target=process, args=(4,))

    p1.start()
    p2.start()
    p3.start()
    p4.start()


if __name__ == '__main__':
    main()

这取决于您的用例。 如果您要做的只是终止进程,则可以使用Process.terminate()方法停止它们。 您还可以在创建进程时将multiprocessing.Event对象传递给进程,然后让主进程捕获KeyboardInterrupt然后设置事件对象。 您将需要在子进程中检查该事件,以查看是否应该关闭它。 如果您要进行更复杂的消息传递,则可能要改用multiprocessing.Queue 哎呀,您甚至可以使用套接字在进程之间发送消息。 这是一个使用multiprocessing.Event的示例:

from multiprocessing import Process, Event
from time import sleep


def proc(n, event):
    while not event.wait(1.0):
        pass


def main():
    event = Event()
    procs = []
    for i in range(4):
        procs.append(Process(target=proc, args=(i, event)))
        procs[-1].start()

    while True:
        try:
            sleep(1)
        except KeyboardInterrupt:
            event.set()
            break

    for p in procs:
        p.join()

如果您不想为子进程执行一些清理代码,只需将它们设置为守护进程即可,如果主线程终止,它们将终止。

p1 = Process(target=process, args=(1,), daemon=True)

如果要进行清理,可以使用atexit内置模块注册退出处理程序。

import atexit

def clean_up():
    # do some clean up
    ....

atexit.register(clean_up)

因此,在主线程退出时将调用函数clean_up

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM