Python中模块变量的生存期

Python中模块变量的生存期,python,Python,你能给我解释一下这些基本知识吗。 server\u init()->start\u db()->它使变量state=5->服务器在2秒内启动start\u client()->客户端调用get\u state()并获取值=5 客户看到5是对的吗?模块变量的有效期是多久? 谢谢 server.py: def t3(): time.sleep(2) start_client() def server_init(): start_db() thread = threa

你能给我解释一下这些基本知识吗。
server\u init()->start\u db()->它使变量state=5->服务器在2秒内启动start\u client()->客户端调用get\u state()并获取值=5
客户看到5是对的吗?模块变量的有效期是多久? 谢谢

server.py:

def t3():
    time.sleep(2)
    start_client()

def server_init():
    start_db()
    thread = threading.Thread(target=t3)
    thread.start()

server_init()
db.py

state = 0
q = queue.Queue()

def t2():
    global state
    while state < 5:
        state += 1
        global q
    q.put(state)

def start_db():
    thread = threading.Thread(target=t2)
    thread.start()

def get_state():
    print('q.get(): %s' % q.get())
    print('state: %s' % state)
def t1():
    get_state()  # prints 5

def start_client():
    print('start_client')
    thread = threading.Thread(target=t1)
    thread.start()

模块存储在全局映射
sys.Modules
中。只要模块对象有任何可用的引用,它就会保持活动状态。通常,在Python解释器关闭之前,不会从sys.modules中删除模块。

您预期会发生什么?您是否感到惊讶,
状态仍然是
5
?没有任何操作会将该值重置回0。如果服务器具有“导入开始\u客户端”和“导入获取\u客户端”状态,我是否可以说我一直都有一个从服务器到数据库的引用?@Igor:第一次导入模块时,所有顶级代码(包括
状态=0
)执行,结果名称存储在模块对象上。因此,任何导入
db
模块的代码都将产生全局名称
状态