2

根據the official python documentation,「finally」語句將始終執行,因此通常用於清理操作。finally語句不會在線程中生效

如果「finally」存在,它指定一個「清理」處理程序。執行「try」子句,包括任何「except」和「else」子句。如果任何一個條款發生異常並且沒有被處理,則異常被臨時保存。 「finally」子句被執行。如果有一個保存的異常,它會在「finally」子句的末尾重新提出。如果說「終於」條款提出了另一個異常或執行了return或break語句,保存異常被丟棄:

然而,當我在一個線程中實現了「嘗試,終於」聲明「終於」部分,似乎沒有被執行。

from __future__ import print_function 
import threading 
def thread1(): 
    try: 
     while True: 
      pass 
    except: 
     print("exception") 
    finally: 
     print("closed") 

t = threading.Thread(target = thread1) 
t.setDaemon(True) 
t.start() 
while True: 
    pass 

當被ctrl-c中斷時,屏幕上不會打印出「closed」。這是爲什麼?

而在下面的代碼「終於」不工作(沒有驚奇)

from __future__ import print_function 
try: 
    while True: 
     pass 
finally: 
    print("closed") 

回答

2

the documentationthread模塊(其underlies threading):

當主線程退出時,它是定義系統中的其他線程是否存活。在使用本地線程實現的SGI IRIX上,它們能夠存活下來。在大多數其他系統上,它們在不執行try ... finally子句或執行對象析構函數的情況下被殺死。

+1

謝謝!那麼我應該怎麼做一個線程的清理? –

+0

在主線程中和從其處理程序中截取signal.SIGINT將發送所有子線程消息以進行清理並停止。最簡單的方法是一個共享的全局變量,子線程檢查其主循環。 – void

+0

如果子線程阻塞等待輸入(例如來自網絡),該怎麼辦? – user48956

-1

CTRL + C殺死了腳本,即停止運行,並沒有別的會處理。

+0

這並不回答這個問題。而且,這不是真的;您可以捕獲KeyboardInterrupt並繼續處理。 –