前言
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” 的操作。其他协程必须等待,直到某个正在运行的协程完成并释放信号量。
结语
第三百零一篇博文写完,开心!!!!
今天,也是充满希望的一天。