在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 greenlet实现原理和使用示例
Sep 24 Python
分析在Python中何种情况下需要使用断言
Apr 01 Python
通过数据库向Django模型添加字段的示例
Jul 21 Python
R语言 vs Python对比:数据分析哪家强?
Nov 17 Python
详解Python异常处理中的Finally else的功能
Dec 29 Python
Python使用re模块正则提取字符串中括号内的内容示例
Jun 01 Python
python将一组数分成每3个一组的实例
Nov 14 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
python给微信好友定时推送消息的示例
Feb 20 Python
Django admin管理工具TabularInline类用法详解
May 14 Python
python不同版本的_new_不同点总结
Dec 09 Python
Python实现天气查询软件
Jun 07 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防注入及开发安全详细解析
2013/08/09 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
使用ajaxfileupload.js实现上传文件功能
2016/08/13 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
实例详解Node.js 函数
2018/06/10 Javascript
javascript实现小型区块链功能
2019/04/03 Javascript
JavaScript实现tab栏切换效果
2020/03/16 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
[01:00:44]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第三局
2016/03/04 DOTA
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
Python实现遍历windows所有窗口并输出窗口标题的方法
2015/03/13 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
Python Merge函数原理及用法解析
2020/09/16 Python
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
统计学专业毕业生的自我评价分享
2013/11/28 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
升学宴家长答谢词
2015/09/29 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
详解Python为什么不用设计模式
2021/06/24 Python
如何利用golang运用mysql数据库
2022/03/13 Golang