当前位置:主页 > python教程 > 在python里协程使用同步锁Lock的实例

python里协程使用同步锁Lock的代码分析

发布:2020-01-17 08:53:05 139


给大家整理一篇python同步锁相关的编程文章,网友益含景根据主题投稿了本篇教程内容,涉及到python、同步锁、Lock、在python里协程使用同步锁Lock的实例相关内容,已被275网友关注,如果对知识点想更进一步了解可以在下方电子资料中获取。

在python里协程使用同步锁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下载网页源码功能实现方法

    发布:2019-11-25

    这篇文章主要介绍了Python实现的下载网页源码功能,涉及Python基于http请求与响应实现的网页源码读取功能相关操作技巧,需要的朋友可以参考下


  • Python中应用protobuf的示例详解

    发布:2023-04-05

    这篇文章主要来和大家聊一聊 protobuf,它是一个数据序列化和反序列化协议,因此它和 json 的定位是一样的。文中的示例代码讲解详细,感兴趣的可以了解一下


  • Python中如何实现真正的按位取反运算

    发布:2023-04-17

    按位取反是位运算符,而位运算符是应用在两个数的运算上,会对数字的二进制所有位数进行从低到高的运算,下面这篇文章主要给大家介绍了关于Python中如何实现真正的按位取反运算的相关资料,需要的朋友可以参考下


  • ReentrantLock源码详解:条件锁

    发布:2022-04-10

    这篇文章主要介绍了ReentrantLock源码之条件锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们来一起学习一下吧


  • python怎么定义变量

    python怎么定义变量

    发布:2022-09-06

    给网友朋友们带来一篇关于python的教程,python中变量就是代表某个数据(值)的名称。定义变量,如x=5,x是一个变量,它的值是5。变量和值之间用=链接。在赋值时,值是什么数据类型,就决定了这个变量的类型,变量名引用了数值的同


  • 关于Python开发SQLite3数据库相关操作实例详解【连接,查询,插入,更新,删除,关闭等】

    发布:2020-01-15

    这篇文章主要介绍了Python开发SQLite3数据库相关操作,结合实例形式较为详细的分析了Python操作SQLite3数据库的连接,查询,插入,更新,删除,关闭等相关操作技巧,需要的朋友可以参考下


  • python实现http服务器功能详解

    发布:2019-06-10

    这篇文章主要为大家详细介绍了python实现简单http服务器功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • Java AQS中ReentrantReadWriteLock读写锁的使用

    发布:2023-04-16

    ReentrantReadWriteLock称为读写锁,它提供一个读锁,支持多个线程共享同一把锁。这篇文章主要讲解一下ReentrantReadWriteLock的使用和应用场景,感兴趣的可以了解一下


网友讨论