可以使用asyncio.Lock来确保只有一个协程在同时执行添加或者获取操作,防止被阻塞。下面是示例代码:
import asyncio
async def producer(q, lock):
while True:
async with lock:
await q.put('data')
await asyncio.sleep(1)
async def consumer(q, lock):
while True:
async with lock:
data = await q.get()
print(data)
await asyncio.sleep(1)
async def main():
q = asyncio.Queue()
lock = asyncio.Lock()
producer_task = asyncio.create_task(producer(q, lock))
consumer_task = asyncio.create_task(consumer(q, lock))
await asyncio.gather(producer_task, consumer_task)
asyncio.run(main())
在这段示例代码中,我们创建了一个异步锁asyncio.Lock(),并在producer和consumer协程中使用with关键字来对锁进行上下文管理。
这样,在任何时候,只会有一个协程在执行添加或获取操作,防止了队列被卡住的情况出现。