请教 python import 如何保证多线程安全的?
比如线程 1 import file1, 同时线程 2 import file1, 如何保证不冲突的?
1
cz5424 342 天前 via iPhone
你不启动线程都是同步操作,先 import 先执行。如果两个 import 里面有启动线程,请了解一下线程锁
|
2
nno 342 天前
python 的多线程跟 dart 一样,都是顺序执行的
|
3
femto OP 线程锁?你指 GIL 么,还是只是程序层面的 lock/semaphore 等?但是不管是 GIL 还是 lock/semaphore,反正都是锁住,如果 file1 里有 sleep(5000),那么 thread 1 import file1 等待 5000, thread 2 import file1 也要等待 5000 了.
两个 import 里面有启动线程?什么意思?只有 1 个 import,但是是 2 个线程都执行这段代码。 比方一个 web 框架,handler.py 里 import FooHandler 。这行 import 可能多个线程刚好同时执行。(如果 thread1 先 import 完,其他 thread 就不用 import 了,这行直接返回的) |
4
superrichman 342 天前
GIL 限制了同一时刻只能有一个线程在执行
|
5
lambdaq 342 天前
python 没有线程安全。你要较真,a += 1 都不安全。
|
6
djangovcps 342 天前
不太理解你的场景哦,导包那里冲突了,你的包有初始化数据操作?
|
7
pursuer 342 天前
@femto 同一个模块不卸载或 reload 的情况只会加载一次,另外互斥锁的实现保证同一时刻一定只有一个线程执行互斥体,没有刚好同时执行的可能。关于互斥锁的实现方式就比较多了可以自己查
|
8
kkbblzq 342 天前
@femto 第一个 5s 之后第二个就直接返回了,哪来的俩 5s
PS: import 是通过锁的,可以自己翻一下源码: https://github.com/python/cpython/blob/main/Python/import.c |
9
sujin190 342 天前 3
https://github.com/python/cpython/blob/main/Python/import.c#L103C12-L103C12 单独加锁了呗,这有啥复杂的,有单独的 import 锁,并且属于整个解释器的,所以并不能并发 import
|
10
itskingname 342 天前
Python 的 import 自带锁,也自带缓存。
在微观上串行,必定有一个线程会先运行到 import 这里。然后这个线程就会自动加锁。此时另一个线程在 import 这个包的时候,是处于阻塞等待的状态。等到第一个线程导入完成,并且把导入结果添加缓存以后。锁释放了,第二个线程才能开始 import 流程。但是第二个线程此时发现缓存里面已经有数据了,于是直接从缓存里面拿结果。 |