![](/img/trans.png)
[英]Using mutliprocessing, when are variables from the main process imported in the child processes?
[英]How to use KeyboardInterrupt from the main process to stop child processes?
运行以下代码,然后执行Ctrl+C
可以使p1
, p2
, p3
和p4
在后台运行(其中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.