V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
femto
V2EX  ›  Python

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

  •  
  •   femto · 342 天前 · 1812 次点击
    这是一个创建于 342 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    在微观上串行,必定有一个线程会先运行到 import 这里。然后这个线程就会自动加锁。此时另一个线程在 import 这个包的时候,是处于阻塞等待的状态。等到第一个线程导入完成,并且把导入结果添加缓存以后。锁释放了,第二个线程才能开始 import 流程。但是第二个线程此时发现缓存里面已经有数据了,于是直接从缓存里面拿结果。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2787 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:48 · PVG 21:48 · LAX 05:48 · JFK 08:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.