导入静默杀死线程

时间:2017-09-19 00:34:15

标签: python multithreading python-2.7

我有一个简单的程序Base.py,用于测试import是否能够在模块不存在时抛出异常。

# Base.py
import threading, os, time
import_is_working = False

class Launch(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.start()
    def run(self):
        global import_is_working
        try:
            print "Yes, it got into the 'try' block"
            import NON_EXISTENT_MODULE
            assert False
        except:
            print "Great, your python language is working"
            import_is_working = True
Launch()
for i in range(500):
    time.sleep(0.01)
    if import_is_working:
        break
if not import_is_working:
    print "Your import is not working."
    os._exit(4)

有时我喜欢在另一个模块Main.py中使用此代码:

# Main.py
import Base

令人惊讶的是,当我以这种方式运行它时它不起作用:

max% python Base.py
Yes, it got into the 'try' block
Great, your python language is working
max% python Main.py
Yes, it got into the 'try' block
Your import is not working.
max%

这种情况发生在Ubuntu中,并且在一个干净的CentOS 7.3安装中也是如此。

1 个答案:

答案 0 :(得分:2)

您正在进入“导入锁定”。

documentation提及线程中导入的限制,你违反了第一个(强调我的):

  

虽然进口机器是线程安全的,但有两个关键   螺纹导入的限制由于固有的限制   提供线程安全的方式:

     

首先,除了在主模块中,导入不应该产生产生新线程然后等待它的副作用   以任何方式线程。不遵守这一限制可能导致a   如果生成的线程直接或间接尝试死锁   导入模块。

     

其次,所有导入尝试必须在解释器开始关闭之前完成。这可能是最容易的   仅通过从创建的非守护程序线程执行导入来实现   通过线程模块。守护程序线程和线程已创建   直接用线程模块将需要一些其他形式   同步以确保它们不会在系统之后尝试导入   关闭已经开始。不遵守这一限制将导致   解释器关闭期间的间歇性异常和崩溃(如   迟到的进口试图进入不再存在的机器   有效的国家)。