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

2024-01-05 11:32:48 +08:00
 femto

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

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

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

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

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

https://tanronggui.xyz/t/1006096

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

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

© 2021 V2EX