Python asyncio协程中同步锁Lock的使用详解

远山来客
远山来客
发布时间:2026-10-13 | 4人浏览过
原创

本文介绍Python asyncio库中协程的同步机制。尽管基于单线程调度,协程执行仍具并发性和乱序特征,需借助同步对象处理I/O中断或延时。通过定义Lock对象,确保同一时刻仅一个协程访问共享资源,其他协程阻塞等待。文章提供完整代码示例,展示锁的创建、获取、释放及回调机制,帮助开发者理解并应用协程同步锁。

虽然asyncio库基于单线程执行协程,但其仍具备并发特性,且执行顺序可能无序。这本质上是一个单线程调度系统,由于执行过程中存在延时或I/O中断等情况,当多个协程需要同步时,必须使用特定的同步对象来协调。

例如,asyncio提供了锁对象Lock,它保证在同一时刻仅允许一个协程访问共享资源。若多个协程试图同时访问,其余协程将被阻塞。这意味着,只要有一个协程未释放锁,其他协程就无法访问该共享资源。

具体示例如下:

import asyncio
import functools
 
 
def unlock(lock):
  print('callback releasing lock')
  lock.release()
 
 
async def coro1(lock):
  print('coro1 waiting for the lock')
  with await lock:
    print('coro1 acquired lock')
  print('coro1 released lock')
 
 
async def coro2(lock):
  print('coro2 waiting for the lock')
  await lock
  try:
    print('coro2 acquired lock')
  finally:
    print('coro2 released lock')
    lock.release()
 
 
async def main(loop):
  # Create and acquire a shared lock.
  lock = asyncio.Lock()
  print('acquiring the lock before starting coroutines')
  await lock.acquire()
  print('lock acquired: {}'.format(lock.locked()))
 
  # Schedule a callback to unlock the lock.
  loop.call_later(0.1, functools.partial(unlock, lock))
 
  # Run the coroutines that want to use the lock.
  print('waiting for coroutines')
  await asyncio.wait([coro1(lock), coro2(lock)]),
 
 
event_loop = asyncio.get_event_loop()
try:
  event_loop.run_until_complete(main(event_loop))
finally:
  event_loop.close()

运行上述代码,输出结果如下:

acquiring the lock before starting coroutines
lock acquired: True
waiting for coroutines
coro1 waiting for the lock
coro2 waiting for the lock
callback releasing lock
coro1 acquired lock
coro1 released lock
coro2 acquired lock
coro2 released lock

以上关于Python中协程使用同步锁Lock的实例分享完毕,希望能对读者有所帮助,也欢迎大家继续支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表