Python 如何在多处理程序中退出整个应用程序

Python 如何在多处理程序中退出整个应用程序,python,multiprocessing,exit,Python,Multiprocessing,Exit,下面是示例代码,正如所描述的代码一样,我想在一次运行过程中退出整个应用程序。但当我调用exit0函数时,其他一些处理仍在运行。那么,如何同时杀死所有正在运行的进程呢?感谢您的帮助 from multiprocessing import Process def submit_process(): sig = False #Here is some codes trying to change the value of the variable sig print "su

下面是示例代码,正如所描述的代码一样,我想在一次运行过程中退出整个应用程序。但当我调用exit0函数时,其他一些处理仍在运行。那么,如何同时杀死所有正在运行的进程呢?感谢您的帮助

from multiprocessing import Process
def submit_process():
    sig = False

    #Here is some codes trying to change the value of the variable sig

    print "submit_process"

    if(sig == True):
        #Here i want to exit the entire program instead of the single thread only.
        #exit(0)
        pass

process_list = []
print "OK"
for i in range(10):
    process = Process(target = submit_process)
    process.start()
    process_list.append(process)

for i in range( len(process_list) ):
    process_list[i].join()
您可以调用。终止进程列表中的所有内容。这通常是一个坏主意,因为您的流程的子流程将成为孤立的

终止进程。在Unix上,这是使用 SIGTERM信号;在Windows上使用TerminateProcess。注意,退出 不会执行处理程序和finally子句等

请注意,进程的子进程将不会终止—— 他们将成为孤儿

在您的情况下,它看起来像:

from multiprocessing import Process
def submit_process():
    sig = False

    #Here is some codes trying to change the value of the variable sig

    print "submit_process"

    if(sig == True):
        # Terminate all spawned processes
        for process in process_list:
          process.terminate()
        exit(0)

process_list = []
print "OK"
for i in range(10):
    process = Process(target = submit_process)
    process.start()
    process_list.append(process)

for i in range( len(process_list) ):
    process_list[i].join()

如果您的流程功能(例如submit_流程)有一个循环,您可以在该循环中测试条件,则可以使用mp.事件:

import multiprocessing as mp
import time
import logging

logger = mp.log_to_stderr(logging.DEBUG)
logger.setLevel(logging.INFO)

def submit_process(i, sig):
    logger.info("submit_process")
    while True:
        #Here is some codes trying to change the value of the variable sig
        if i == 0:
            time.sleep(2)
            sig.set()
            logger.info('SETTING sig')
        time.sleep(1)
        if sig.is_set():
            #Here i want to exit the entire program instead of the single thread only.
            #exit(0)
            logger.info('sig is set!')
            break
        else:
            logger.info('sig is NOT set!')            

process_list = []
logger.info("OK")
sig = mp.Event()
for i in range(3):
    process = mp.Process(target = submit_process, args = (i, sig, ))
    process.start()
    process_list.append(process)

for i in range( len(process_list) ):
    process_list[i].join()
屈服

[INFO/MainProcess] OK
[INFO/Process-2] child process calling self.run()
[INFO/Process-2] submit_process
[INFO/Process-3] child process calling self.run()
[INFO/Process-1] child process calling self.run()
[INFO/Process-3] submit_process
[INFO/Process-1] submit_process
[INFO/Process-2] sig is NOT set!
[INFO/Process-3] sig is NOT set!
[INFO/Process-2] sig is NOT set!
此处process-1设置mp.事件:

[INFO/Process-1] SETTING sig
在这里,过程识别到sig已设置并中断while循环:

[INFO/Process-3] sig is set!
[INFO/Process-3] process shutting down
[INFO/Process-3] process exiting with exitcode 0
[INFO/Process-2] sig is set!
[INFO/Process-2] process shutting down
[INFO/Process-2] process exiting with exitcode 0
[INFO/Process-1] sig is set!
[INFO/Process-1] process shutting down
[INFO/Process-1] process exiting with exitcode 0
[INFO/MainProcess] process shutting down