在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中的数据存储到系统本地的简单方法
Apr 11 Python
Python中动态创建类实例的方法
Mar 24 Python
使用Python写CUDA程序的方法
Mar 27 Python
TensorFlow打印tensor值的实现方法
Jul 27 Python
老生常谈python中的重载
Nov 11 Python
pandas通过索引进行排序的示例
Nov 16 Python
python3实现二叉树的遍历与递归算法解析(小结)
Jul 03 Python
代码实例讲解python3的编码问题
Jul 08 Python
python脚本之一键移动自定格式文件方法实例
Sep 02 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 Python
keras实现VGG16方式(预测一张图片)
Jul 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下escape解码函数的实现方法
2010/08/08 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
2012/04/09 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
smarty模板引擎从配置文件中获取数据的方法
2015/01/22 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
laravel 实现根据字段不同值做不同查询
2019/10/23 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
前台js调用后台方法示例
2013/12/02 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
JS+CSS3模拟溢出滚动效果
2016/08/12 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
Python采集腾讯新闻实例
2014/07/10 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
Python实现对象转换为xml的方法示例
2017/06/08 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
Python中的pathlib.Path为什么不继承str详解
2019/06/23 Python
pytorch实现建立自己的数据集(以mnist为例)
2020/01/18 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
HTML5文档结构标签
2017/04/21 HTML / CSS
Vision Direct比利时:在线订购隐形眼镜
2019/08/27 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
大学生自我鉴定书
2014/03/24 职场文书
秋天的图画教学反思
2014/05/01 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
2014年公务员工作总结
2014/11/18 职场文书
诚信承诺书
2015/01/19 职场文书
教师旷工检讨书
2015/08/15 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
Vue2.0搭建脚手架
2022/03/13 Vue.js