在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中利用函数装饰器实现备忘功能
Mar 30 Python
python实现连接mongodb的方法
May 08 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
用Python读取几十万行文本数据
Dec 24 Python
python反编译学习之字节码详解
May 19 Python
如何利用python给图片添加半透明水印
Sep 06 Python
解决python彩色螺旋线绘制引发的问题
Nov 23 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
详解Python中list[::-1]的几种用法
Nov 16 Python
Python类class参数self原理解析
Nov 19 Python
Python中的 No Module named ***问题及解决
Jul 23 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学习之字符串比较和查找
2011/04/17 PHP
php提示undefined index的几种解决方法
2012/05/21 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
深入分析JSON编码格式提交表单数据
2015/06/25 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
JS时间控制实现动态效果的实例讲解
2017/07/31 Javascript
vue实现验证码输入框组件
2017/12/14 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
区别JavaScript函数声明与变量声明
2018/09/12 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
[01:05:59]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
使用Python读取二进制文件的实例讲解
2018/07/09 Python
Python 多维List创建的问题小结
2019/01/18 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
食品安全工作实施方案
2014/03/26 职场文书
计算机实训报告总结
2014/11/05 职场文书
毕业论文致谢范文
2015/05/14 职场文书
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers