Tôi đã nhìn thấy rất nhiều câu hỏi liên quan đến điều này ... nhưng mã của tôi hoạt động trên trăn 2.6.2 và không hoạt động để hoạt động trên trăn 2.6.5. Tôi có sai khi nghĩ rằng toàn bộ các chức năng "không được phép đăng ký qua mô-đun này không được gọi khi chương trình bị giết bởi tín hiệu" điều không nên tính ở đây vì tôi đang bắt tín hiệu và sau đó thoát ra khỏi sạch? Những gì đang xảy ra ở đây? Whats cách thích hợp để làm điều này?python 2.6.x theading/signal/atexit thất bại trên một số phiên bản?
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()
python 2.6.2:
$ python halp.py
looping
looping
looping
main
looping
main
looping
looping
looping
main
looping
^Ccaught signal
shutdown detected
stopping thread
python 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
Các chủ đề chính trên 2.6.5 dường như không bao giờ thực hiện các chức năng atexit.
Tôi đã thử mã trên Python 2.6.5 và Python 2.6.1 trên OS X 10.6 và chúng hoạt động giống như được mô tả trong câu hỏi (2.6.5 không thực thi lệnh atexit trong khi 2.6.1 có). Tôi hy vọng mọi người thông thạo hơn trong mã nguồn Python sẽ tư vấn về những gì đã thay đổi. –
có thể đã mất sự quan tâm đến điều này hoặc tìm thấy một giải pháp thay thế, nhưng tôi vẫn quan tâm đến những gì đã thay đổi giữa hai phiên bản Python để kích hoạt điều này. Thay vì hỏi cùng một câu hỏi một lần nữa, tôi sẽ bắt đầu một tiền thưởng về điều này. Tôi hy vọng anh ta không phiền. –