1

这是示例代码,就像所描述的代码一样,我想在一个正在运行的处理中退出整个应用程序。但是当我调用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()
4

2 回答 2

0

您可以调用.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()
于 2012-06-16T16:59:56.417 回答
0

如果您的流程函数(例如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
于 2012-06-16T17:17:33.767 回答