在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实现进程间通信简单实例
Jul 23 Python
Python、Javascript中的闭包比较
Feb 04 Python
python实现类的静态变量用法实例
May 08 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
Apr 15 Python
利用python批量给云主机配置安全组的方法教程
Jun 21 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
python实现登录密码重置简易操作代码
Aug 14 Python
python读取ini配置文件过程示范
Dec 23 Python
opencv python图像梯度实例详解
Feb 04 Python
利用django model save方法对未更改的字段依然进行了保存
Mar 28 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 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命名空间namespace的定义方法详解
2017/03/29 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
JS左右无缝滚动(一般方法+面向对象方法)
2012/08/17 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
js闭包的用途详解
2014/11/09 Javascript
JS不完全国际化&本地化手册 之 理论篇
2016/09/27 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
js实现圆形菜单选择器
2020/12/03 Javascript
python发腾讯微博代码分享
2014/01/10 Python
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
python制作小说爬虫实录
2017/08/14 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
Python多线程原理与用法详解
2018/08/20 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
opencv+python实现均值滤波
2020/02/19 Python
Python 爬虫的原理
2020/07/30 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题
2021/01/19 HTML / CSS
凯特方迪化妆品官网:Kat Von D Beauty
2016/11/15 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
实习鉴定范文
2013/12/19 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
门店店长岗位职责
2015/04/14 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
公安机关起诉意见书
2015/05/20 职场文书