1

これがサンプルコードです。説明されているコードと同じように、実行中の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

プロセス関数 (例: 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 に答える
0

.terminate()プロセス リスト内のすべてを呼び出すことができます。ただし、プロセスのサブプロセスが孤立するため、これは一般的に悪い考えです。

からmultiprocessing

terminate() プロセスを終了します。Unix では、これは SIGTERM シグナルを使用して行われます。Windows では TerminateProcess() が使用されます。exit ハンドラや 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 に答える