我有一个简单的程序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安装中也是如此。
答案 0 :(得分:2)
您正在进入“导入锁定”。
documentation提及线程中导入的限制,你违反了第一个(强调我的):
虽然进口机器是线程安全的,但有两个关键 螺纹导入的限制由于固有的限制 提供线程安全的方式:
首先,除了在主模块中,导入不应该产生产生新线程然后等待它的副作用 以任何方式线程。不遵守这一限制可能导致a 如果生成的线程直接或间接尝试死锁 导入模块。
其次,所有导入尝试必须在解释器开始关闭之前完成。这可能是最容易的 仅通过从创建的非守护程序线程执行导入来实现 通过线程模块。守护程序线程和线程已创建 直接用线程模块将需要一些其他形式 同步以确保它们不会在系统之后尝试导入 关闭已经开始。不遵守这一限制将导致 解释器关闭期间的间歇性异常和崩溃(如 迟到的进口试图进入不再存在的机器 有效的国家)。