Pythonプロセスな通話atexit
-
23-09-2019 - |
質問
私は利用しよう 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()が呼び出されます。
所属していません StackOverflow