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
ALLROBOT
V2EX  ›  Python

请教 asyncio 生产-消费函数使用互斥锁保护 queue 共享资源

  •  
  •   ALLROBOT · 2023-03-10 07:11:29 +08:00 · 1464 次点击
    这是一个创建于 657 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,库函数看的累人,希望有人口语化解释一下

    python 3.8.0

    1. 使用 semaphore 控制并发访问资源,并发访问网络资源并保存到本地,问了 chatgpt ,它说如果获取网页资源后,在 queue.put(xx)或 queue.get()之前不加 asyn with lock ,生产函数可能会覆盖队列中的数据、或者几个消费函数争抢同一个数据?

    实际测试,不管加不加锁,生产函数没有覆盖数据的情况,消费函数们各拿各自的,没有多个消费函数拿同一个队列同一个数据的情况,实际情况怎么样就不清楚了

    那么,有必要加锁给消费函数获得独占 queue 的访问权限,确保仅有一个消费函数只拿一个数据,这样会防止数据竞争的问题?

    1. 使用 semaphore>=2 的情况下,算是多个生产函数往 queue 添加数据吗?

    chatgpt 回答自相矛盾,说用semaphore的情景下,能保护共享资源不会发生数据争抢。。。我问既然用semaphore那有必要用asyn with lock么,它答如果不加锁会导致访问共享资源产生的一些问题。。。

    6 条回复    2023-03-13 10:03:47 +08:00
    ruanimal
        1
    ruanimal  
       2023-03-10 09:55:34 +08:00
    queue 是线程安全的
    raymanr
        2
    raymanr  
       2023-03-10 10:18:45 +08:00
    没用过 semaphore, 不过感觉没必要给 queue 加锁吧
    copper20
        3
    copper20  
       2023-03-10 10:35:14 +08:00   ❤️ 1
    1. chatgpt 说话信一半就行了
    2. py 的 queue 本身都是多线程安全的,queue.Queue 用 mutex 实现,queue.SimpleQueue 用 semaphore 实现
    3. 使用 semaphore>=2 的情况下,算是多个生产函数往 queue 添加数据,但是因为 queue 本身多线程安全,所以问题不大
    4. semaphore 和 mutex 可以认为是对于一组资源的不同保护策略,针对一组资源一般只用一种策略
    zzl22100048
        4
    zzl22100048  
       2023-03-10 17:41:51 +08:00
    asyncio 的 queue 不需要锁,本身就是协程安全的
    ALLROBOT
        5
    ALLROBOT  
    OP
       2023-03-10 20:00:48 +08:00 via Android
    @zzl22100048 @ruanimal @copper20 明白了,感谢解惑
    ruanimal
        6
    ruanimal  
       2023-03-13 10:03:47 +08:00
    别把 chatgpt 的话当真,v2ex 现在这种情况很多。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6073 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 02:01 · PVG 10:01 · LAX 18:01 · JFK 21:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.