00301 Python asyncio.Semaphore


前言

python asyncio.Semaphore

Operating System: Ubuntu 22.04.4 LTS

参考文档

介绍

asyncio.Semaphore 是 Python 的 asyncio 模块中的一个同步原语,用于控制对共享资源的访问数量。它是一个计数信号量,用于限制可以同时访问特定资源的协程数量。

在并发编程中,当你想要限制同时执行某个操作的数量时,信号量非常有用。例如,你可能想要限制网络连接的数量,或者控制对共享资源的并发访问次数,以避免资源争用或过载。

以下是 asyncio.Semaphore 的一些关键点:

  • 初始化:创建一个 Semaphore 对象时,你需要指定一个数量,这个数量表示信号量可以允许的最大并发数量。
  • 获取信号量:协程通过调用 semaphore.acquire() 方法来获取信号量。如果信号量的计数大于0,则将其减1并立即返回。如果计数为0,则协程将被阻塞,直到其他协程释放信号量。
  • 释放信号量:当协程完成对共享资源的访问后,它必须通过调用 semaphore.release() 方法来释放信号量,这将增加信号量的计数,并允许其他等待的协程继续执行。
  • 上下文管理器Semaphore 对象可以用作上下文管理器,在进入上下文时自动获取信号量,并在退出时自动释放它。

以下是一个简单的示例,展示了如何使用 asyncio.Semaphore

import asyncio

async def worker(semaphore, worker_id):
    async with semaphore:
        print(f"Worker {worker_id} is working")
        await asyncio.sleep(1)  # 模拟耗时操作
        print(f"Worker {worker_id} is done")

async def main():
    # 创建一个允许3个并发访问的信号量
    semaphore = asyncio.Semaphore(3)
    
    # 创建并启动5个worker协程
    tasks = [worker(semaphore, i) for i in range(5)]
    await asyncio.gather(*tasks)

asyncio.run(main())

在这个例子中,尽管我们创建了5个 worker 协程,但由于信号量的限制,同一时间只能有3个协程执行打印 “Worker X is working” 的操作。其他协程必须等待,直到某个正在运行的协程完成并释放信号量。

结语

第三百零一篇博文写完,开心!!!!

今天,也是充满希望的一天。


文章作者: LuYF-Lemon-love
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LuYF-Lemon-love !
  目录