qic*_*_he 2 python multithreading python-import
最近在用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()
Run Code Online (Sandbox Code Playgroud)
在 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)
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
所以,锁似乎没有效果。我测试了是否将 foo1 和 foo2 放在同一个 .py 文件中,它会起作用。
谁能告诉我为什么?
而且我知道这可能涉及一些python如何处理导入的基本知识,请原谅我的无知。
这是 Python 导入系统中真正令人困惑的部分之一。您没有两个模块,test并且test2. 您有三个模块__main__,test、 和test2。同样,您没有一把锁,test.lock. 你有两把锁,__main__.lock和test.lock。
当您运行 时python test.py,Python 开始test.py作为__main__模块而不是test模块执行。当__main__导入test2和test2导入时test,Pythontest.py 再次开始运行,这次是作为test模块。不在里面的所有东西if __name__ == '__main__'都会再次运行,包括lock = Lock(),制作第二个锁。
在 中__main__,您设置线程运行的两个函数是__main__.foo1和test2.foo2。__main__.foo1正在使用__main__.lock,而test2.foo2正在使用test.lock从test. 由于这些是不同的锁,因此不存在互斥。
与您的问题没有直接关系,但不要调用您的 modules test,因为该名称已经有一个标准库模块,并且不要使用循环导入。有test进口test2和test2进口test将导致各种讨厌的虫子。
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |