在python里协程使用同步锁Lock的实例


Posted in Python onFebruary 19, 2019

尽管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 相关文章推荐
Python实现的百度站长自动URL提交小工具
Jun 27 Python
Python中分数的相关使用教程
Mar 30 Python
Python中的列表生成式与生成器学习教程
Mar 13 Python
python各种语言间时间的转化实现代码
Mar 23 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
基于Python 装饰器装饰类中的方法实例
Apr 21 Python
python实现反转部分单向链表
Sep 27 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
详解Python中的分支和循环结构
Feb 11 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
Aug 28 Python
python+selenium爬取微博热搜存入Mysql的实现方法
Jan 27 Python
Python实现GIF动图以及视频卡通化详解
Dec 06 Python
对python 通过ssh访问数据库的实例详解
Feb 19 #Python
python 通过SSHTunnelForwarder隧道连接redis的方法
Feb 19 #Python
深入理解Django-Signals信号量
Feb 19 #Python
python利用跳板机ssh远程连接redis的方法
Feb 19 #Python
Python获取Redis所有Key以及内容的方法
Feb 19 #Python
Python元组常见操作示例
Feb 19 #Python
python redis 删除key脚本的实例
Feb 19 #Python
You might like
ZF等常用php框架中存在的问题
2008/01/10 PHP
脚本收藏iframe
2006/07/21 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
JS中的作用域链
2017/03/01 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
2017/04/12 Javascript
JS动态修改网页body的背景色实例代码
2017/10/07 Javascript
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
python类参数self使用示例
2014/02/17 Python
python实现的一个火车票转让信息采集器
2014/07/09 Python
基于Python的身份证号码自动生成程序
2014/08/15 Python
在RedHat系Linux上部署Python的Celery框架的教程
2015/04/07 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
无故旷工检讨书
2014/01/26 职场文书
学校安全检查制度
2014/01/27 职场文书
火锅店创业计划书范文
2014/02/02 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
学雷锋宣传标语
2014/06/25 职场文书
工艺技术员岗位职责
2015/02/04 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
mysql配置SSL证书登录的实现
2021/09/04 MySQL
关于 Python json中load和loads区别
2021/11/07 Python
python缺失值填充方法示例代码
2022/12/24 Python