在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实现远程调用MetaSploit的方法
Aug 22 Python
python求众数问题实例
Sep 26 Python
Python函数式编程指南(二):从函数开始
Jun 24 Python
python简单获取数组元素个数的方法
Jul 13 Python
python实现中文转换url编码的方法
Jun 14 Python
Ubuntu 下 vim 搭建python 环境 配置
Jun 12 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
Python3和PyCharm安装与环境配置【图文教程】
Feb 14 Python
使用pytorch 筛选出一定范围的值
Jun 28 Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 Python
Django多数据库联用实现方法解析
Nov 12 Python
python Protobuf定义消息类型知识点讲解
Mar 02 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
中东人咖啡哲学
2021/03/03 咖啡文化
php session 检测和注销
2009/03/16 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
2015/03/28 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
微信小程序-form表单提交代码实例
2019/04/29 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
在Python web中实现验证码图片代码分享
2017/11/09 Python
python验证码识别实例代码
2018/02/03 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
实例详解Python装饰器与闭包
2019/07/29 Python
linux下python中文乱码解决方案详解
2019/08/28 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
介绍一下Make? 为什么使用make
2013/12/08 面试题
化学教学随笔感言
2014/02/19 职场文书
公司节能减排倡议书
2014/05/14 职场文书
白莲教口号
2014/06/18 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python
Python图片验证码降噪和8邻域降噪
2021/08/30 Python
Go Grpc Gateway兼容HTTP协议文档自动生成网关
2022/06/16 Golang