在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批量修改文件名的实现代码
Sep 01 Python
Java中重定向输出流实现用文件记录程序日志
Jun 12 Python
python实现可以断点续传和并发的ftp程序
Sep 13 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
Jul 02 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
Dec 10 Python
django框架创建应用操作示例
Sep 26 Python
Python库skimage绘制二值图像代码实例
Apr 10 Python
Python基于Serializer实现字段验证及序列化
Nov 04 Python
Python 列表反转显示的四种方法
Nov 16 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 Python
PO模式在selenium自动化测试框架的优势
Mar 20 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实现登陆验证码(类似条行码状)
2006/10/09 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
2016/04/04 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
php7下的filesize函数
2019/09/30 PHP
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
初窥JQuery(二)事件机制(2)
2010/12/06 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
Python 功能和特点(新手必学)
2015/12/30 Python
python @property的用法及含义全面解析
2018/02/01 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
旅游管理专业学生求职信
2013/09/28 职场文书
网上开商店的创业计划书
2014/01/19 职场文书
常务副总经理任命书
2014/06/05 职场文书
公务员培的训心得体会
2014/09/01 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
2015年个人实习工作总结
2015/05/28 职场文书
sql注入教程之类型以及提交注入
2021/08/02 MySQL