質問

私は利用しよう atexit a Process, が、残念ながら見られるとは思えません。こちらは一部の例のコード:

import time
import atexit
import logging
import multiprocessing

logging.basicConfig(level=logging.DEBUG)

class W(multiprocessing.Process):
    def run(self):
        logging.debug("%s Started" % self.name)

        @atexit.register
        def log_terminate():
             # ever called?
             logging.debug("%s Terminated!" % self.name)

        while True:
            time.sleep(10)

@atexit.register
def log_exit():
    logging.debug("Main process terminated")

logging.debug("Main process started")

a = W()
b = W()
a.start()
b.start()
time.sleep(1)
a.terminate()
b.terminate()

このコード:

DEBUG:root:Main process started
DEBUG:root:W-1 Started
DEBUG:root:W-2 Started
DEBUG:root:Main process terminated

いることを期待し W.run.log_terminate() いたときに呼び出される a.terminate()b.terminate() と呼ばれ、出力されていると思いますが、likeso進!:

DEBUG:root:Main process started
DEBUG:root:W-1 Started
DEBUG:root:W-2 Started
デバッグ:W-1終了!デバッグ:W-2終了!
DEBUG:root:Main process terminated

なぜかということで、ある方メッセージのログをとら Process コンテキストの場合 Process が切断されますか。

ご入力をお願いいのでよろしくお願いいたします。

編集: に基づくソリューション提案によるアレックスMartelli、以下のとして期待:

import sys
import time
import atexit
import signal
import logging
import multiprocessing

logging.basicConfig(level=logging.DEBUG)

class W(multiprocessing.Process):
    def run(self):
        logging.debug("%s Started" % self.name)

        def log_terminate(num, frame):
             logging.debug("%s Terminated" % self.name)
             sys.exit()
        signal.signal(signal.SIGTERM, log_terminate)
        while True:
            time.sleep(10)

@atexit.register
def log_exit():
    logging.debug("Main process terminated")

logging.debug("Main process started")
a = W()
b = W()
a.start()
b.start()
time.sleep(1)
a.terminate()
b.terminate()

この価値あるため、次の点に注意してくださいコメント atexit ドキュメンテーション

注意:に機能を登録したこのモジュールがなされたときに呼び出されプログラムは殺された信号は、Pythonの致命的な内部エラーが検出された場合やos._exit()が呼び出されます。
役に立ちましたか?

解決

として のドキュメント

Unixではこれをベースに制御を行っています。SIGTERM 信;Windows TerminateProcess() を使用します。お口よりハンドラ 最後に条項等 ません 実行されます。

ればこの問題は以下のメソッドの対応することができるでしょう遮断 SIGTERM信号, を行っても"終了の活動"が必要とするしかし、知らないクロスプラットフォームます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top