Python import 如何保证多线程安全的?

318 天前
 femto

请教 python import 如何保证多线程安全的?

比如线程 1 import file1, 同时线程 2 import file1, 如何保证不冲突的?

1791 次点击
所在节点    Python
10 条回复
cz5424
318 天前
你不启动线程都是同步操作,先 import 先执行。如果两个 import 里面有启动线程,请了解一下线程锁
nno
318 天前
python 的多线程跟 dart 一样,都是顺序执行的
femto
318 天前
线程锁?你指 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 了,这行直接返回的)
superrichman
318 天前
GIL 限制了同一时刻只能有一个线程在执行
lambdaq
318 天前
python 没有线程安全。你要较真,a += 1 都不安全。
djangovcps
318 天前
不太理解你的场景哦,导包那里冲突了,你的包有初始化数据操作?
pursuer
318 天前
@femto 同一个模块不卸载或 reload 的情况只会加载一次,另外互斥锁的实现保证同一时刻一定只有一个线程执行互斥体,没有刚好同时执行的可能。关于互斥锁的实现方式就比较多了可以自己查
kkbblzq
318 天前
@femto 第一个 5s 之后第二个就直接返回了,哪来的俩 5s
PS: import 是通过锁的,可以自己翻一下源码: https://github.com/python/cpython/blob/main/Python/import.c
sujin190
318 天前
https://github.com/python/cpython/blob/main/Python/import.c#L103C12-L103C12 单独加锁了呗,这有啥复杂的,有单独的 import 锁,并且属于整个解释器的,所以并不能并发 import
itskingname
318 天前
Python 的 import 自带锁,也自带缓存。

在微观上串行,必定有一个线程会先运行到 import 这里。然后这个线程就会自动加锁。此时另一个线程在 import 这个包的时候,是处于阻塞等待的状态。等到第一个线程导入完成,并且把导入结果添加缓存以后。锁释放了,第二个线程才能开始 import 流程。但是第二个线程此时发现缓存里面已经有数据了,于是直接从缓存里面拿结果。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1006096

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX