在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之有容乃大的list(1)
Sep 14 Python
使用Python求解最大公约数的实现方法
Aug 20 Python
Python ftp上传文件
Feb 13 Python
Django中url的反向查询的方法
Mar 14 Python
Python中的二维数组实例(list与numpy.array)
Apr 13 Python
Python数据抓取爬虫代理防封IP方法
Dec 23 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
Django Sitemap 站点地图的实现方法
Apr 29 Python
python求绝对值的三种方法小结
Dec 04 Python
Python class的继承方法代码实例
Feb 14 Python
Python3创建Django项目的几种方法(3种)
Jun 03 Python
pymysql模块使用简介与示例
Nov 17 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 session 存储方式的详细介绍
2013/06/25 PHP
smarty实现多级分类的方法
2014/12/05 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
JavaScript国旗变换效果代码
2008/08/13 Javascript
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
js实现拖拽功能
2017/03/01 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
JavaScript作用域链实例详解
2019/01/21 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
js验证账户名是否重复
2020/05/26 Javascript
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
Python with语句和过程抽取思想
2019/12/23 Python
python图片合成的示例
2020/11/09 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
绿色家庭事迹材料
2014/05/01 职场文书
学生会工作感言
2015/08/07 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
python基础之停用词过滤详解
2021/04/21 Python
如何使用php生成zip压缩包
2021/04/21 PHP
Go语言中的UTF-8实现
2021/04/26 Golang
Java实现注册登录跳转
2022/06/16 Java/Android