在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获取DLL和EXE文件版本号的方法
Mar 10 Python
详解Python的Django框架中manage命令的使用与扩展
Apr 11 Python
利用Python如何生成随机密码
Apr 20 Python
python简单实例训练(21~30)
Nov 15 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
解决python3 pika之连接断开的问题
Dec 18 Python
python爬虫 execjs安装配置及使用
Jul 30 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
Python wordcloud库安装方法总结
Dec 31 Python
详解Python爬虫爬取博客园问题列表所有的问题
Jan 18 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 02 Python
Python 中的单分派泛函数你真的了解吗
Jun 22 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
php中CI操作多个数据库的代码
2012/07/05 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
php截取中文字符串函数实例
2015/02/23 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
JS 统计时间
2021/03/09 Javascript
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
javascript Demo模态窗口
2009/12/06 Javascript
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
浅析JQuery中的html(),text(),val()区别
2014/09/01 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
2018/09/27 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
Python中的True,False条件判断实例分析
2015/01/12 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
python 接口测试response返回数据对比的方法
2018/02/11 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
Python3的socket使用方法详解
2020/02/18 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
CSS Grid布局教程之浏览器开启CSS Grid Layout汇总
2014/12/30 HTML / CSS
海淘零差价,宝贝全球购: 宝贝格子
2016/08/24 全球购物
How TDD works
2012/09/30 面试题
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
研究生毕业鉴定
2014/01/29 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
民政工作个人总结
2015/02/28 职场文书
家长会开场白和结束语
2015/05/29 职场文书