在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 14 Python
一张图带我们入门Python基础教程
Feb 05 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
Jul 26 Python
Python实现正整数分解质因数操作示例
Aug 01 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
Python 元组操作总结
Sep 18 Python
python 遍历pd.Series的index和value
Nov 26 Python
Python PyInstaller安装和使用教程详解
Jan 08 Python
Python AutoCAD 系统设置的实现方法
Apr 01 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
Jun 06 Python
python实例化对象的具体方法
Jun 17 Python
Selenium及python实现滚动操作多种方法
Jul 21 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(视频)Http下载
2006/12/12 PHP
也谈php网站在线人数统计
2008/04/09 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
Vue渲染过程浅析
2019/03/14 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
Python字符串拼接的几种方法整理
2017/08/02 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
Flask-WTF表单的使用方法
2019/07/12 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
2014年小学植树节活动方案
2014/03/02 职场文书
担保书怎么写
2014/04/01 职场文书
财务科长个人对照检查材料
2014/09/18 职场文书
新党章的学习心得体会
2014/11/07 职场文书
安全承诺书格式范本
2015/04/28 职场文书
2015年国培研修感言
2015/08/01 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python
golang使用map实现去除重复数组
2022/04/14 Golang