finally语句不会在一个线程中生效

时间:2017-02-17 06:50:34

标签: python python-multithreading try-catch-finally try-finally

根据the official python documentation,“finally”语句将始终执行,因此通常用于清理操作。

  

如果存在“finally”,则指定“清理”处理程序。执行“try”子句,包括任何“except”和“else”子句。如果任何子句中发生异常但未处理,则会临时保存该异常。执行“finally”子句。如果存在已保存的异常,则会在“finally”子句的末尾重新引发异常。如果“finally”子句引发另一个异常或执行return或break语句,则丢弃保存的异常:

但是,当我在一个线程中实现“try-finally”语句时,“finally”部分似乎没有被执行。

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中断时,屏幕上不会打印“关闭”。那是为什么?

虽然在下面的代码中“finally”确实有效(毫不奇怪)

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

2 个答案:

答案 0 :(得分:2)

thread模块的the documentationthreading)的基础:

  

当主线程退出时,系统定义其他线程是否存活。在使用本机线程实现的SGI IRIX上,它们存活下来。在大多数其他系统上,它们在不执行try ... finally子句或执行对象析构函数的情况下被终止。

答案 1 :(得分:-1)

CTRL + C会杀死脚本,即它会停止运行,其他任何内容都不会处理。