锁定实例不能在两个.py文件之间共享



最近我一直在用python接触多线程领域。下面的例子将更好地说明我的问题: 所以我有两个.py文件,一个是 test.py 文件,另一个是 test2.py

在 test.py:

import time
from datetime import datetime
from threading import Thread, Lock
lock = Lock()
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(threadName)s %(name)s.%(funcName)s [%(levelname)s]: %(message)s')
def foo1():
while True:
with lock:
logging.info(datetime.now())
time.sleep(0.2)
if __name__ == '__main__':
from test2 import foo2
Thread(target=foo1).start()
Thread(target=foo2).start()

在 test2.py:

import time
from datetime import datetime
from test import logging, lock
def foo2():
while True:
with lock:
logging.info( datetime.now() )
time.sleep(5)

输出:

2017-03-17 17:11:06,210 Thread-1 root.foo1 [INFO]: 2017-03-17 17:11:06.210000
2017-03-17 17:11:06,210 Thread-2 root.foo2 [INFO]: 2017-03-17 17:11:06.210000
2017-03-17 17:11:06,415 Thread-1 root.foo1 [INFO]: 2017-03-17 17:11:06.416000
2017-03-17 17:11:06,619 Thread-1 root.foo1 [INFO]: 2017-03-17 17:11:06.620000

所以,锁似乎没有效果。我测试了如果我将 foo1 和 foo2 放在同一个.py文件中,它会起作用。

谁能告诉我为什么?

我知道这可能涉及一些关于python如何处理导入的基本知识,请原谅我的无知。

这是Python导入系统中真正令人困惑的部分之一。您没有两个模块,testtest2。您有三个模块,__main__testtest2。同样,您没有一把锁,test.lock.您有两个锁,__main__.locktest.lock

当你运行python test.py时,Python 开始将test.py作为__main__模块执行,而不是test模块。当__main__导入test2并且test2导入test时,Python再次开始运行test.py,这次是作为test模块。所有不在if __name__ == '__main__'里面的东西都会再次运行,包括lock = Lock(),进行第二次锁定。

__main__中,您设置线程运行的两个函数是__main__.foo1test2.foo2__main__.foo1使用的是__main__.lock,而test2.foo2使用的是从test导入test.lock。由于这些是不同的锁,因此没有相互排斥。


与您的问题没有直接关系,但不要将模块称为test,因为已经有一个具有该名称的标准库模块,并且不使用循环导入。test导入test2test2导入test会导致各种讨厌的错误。

最新更新