Я видел много вопросов, связанных с этим ... но мой код работает на python 2.6.2 и сбой для работы на python 2.6.5. Я ошибаюсь, думая, что все функции atexit, зарегистрированные через этот модуль, не вызывают, когда программа убита сигналом, «вещь не должна учитываться здесь, потому что я поймаю сигнал, а затем выхожу чисто? Что тут происходит? Каков правильный способ сделать это?python 2.6.x theading/сигналы/atexit сбой в некоторых версиях?
import atexit, sys, signal, time, threading
terminate = False
threads = []
def test_loop():
while True:
if terminate:
print('stopping thread')
break
else:
print('looping')
time.sleep(1)
@atexit.register
def shutdown():
global terminate
print('shutdown detected')
terminate = True
for thread in threads:
thread.join()
def close_handler(signum, frame):
print('caught signal')
sys.exit(0)
def run():
global threads
thread = threading.Thread(target=test_loop)
thread.start()
threads.append(thread)
while True:
time.sleep(2)
print('main')
signal.signal(signal.SIGINT, close_handler)
if __name__ == "__main__":
run()
питон 2.6.2:
$ python halp.py
looping
looping
looping
main
looping
main
looping
looping
looping
main
looping
^Ccaught signal
shutdown detected
stopping thread
питон 2.6.5:
$ python halp.py
looping
looping
looping
main
looping
looping
main
looping
looping
main
^Ccaught signal
looping
looping
looping
looping
...
looping
looping
Killed <- kill -9 process at this point
Основной поток на 2.6.5 появляется никогда не выполняют функции atexit.
Я пробовал код на Python 2.6.5 и Python 2.6.1 на OS X 10.6, и они ведут себя так, как описано в вопросе (2.6.5, не выполняющий atexit, а 2.6.1). Надеюсь, что люди, более разбирающиеся в исходном коде Python, будут советоваться о том, что изменилось. –
, возможно, потерял интерес к этому или нашел обходное решение, но меня все еще интересует то, что изменилось между двумя версиями Python, чтобы вызвать это. Вместо того, чтобы снова задавать один и тот же вопрос, я собираюсь начать щедрость по этому поводу. Надеюсь, он не против. –