根據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")
謝謝!那麼我應該怎麼做一個線程的清理? –
在主線程中和從其處理程序中截取signal.SIGINT將發送所有子線程消息以進行清理並停止。最簡單的方法是一個共享的全局變量,子線程檢查其主循環。 – void
如果子線程阻塞等待輸入(例如來自網絡),該怎麼辦? – user48956