繁体   English   中英

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

[英]how to exit the entire app in a multiprocessing program

这是示例代码,就像描述的代码一样,我想在一个正在运行的处理中退出整个应用程序。 但是当我调用exit(0)函数时,其他一些处理仍在运行。 那么如何同时杀死所有正在运行的进程呢? 任何帮助表示赞赏!

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()

您可以在进程列表中的所有内容上调用.terminate() 尽管您的流程的子流程将变得孤立,但这通常不是一个好主意。

multiprocessing

Terminate()终止进程。 在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_process )具有可以测试条件的循环,则可以为此使用mp.Event:

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.Event:

[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

暂无
暂无

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

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