在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使用base64模块进行二进制数据编码详解
Jan 11 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 Python
解决Django生产环境无法加载静态文件问题的解决
Apr 23 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
Apr 27 Python
python excel转换csv代码实例
Aug 26 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
python实现智能语音天气预报
Dec 02 Python
Django实现前台上传并显示图片功能
May 29 Python
Python基础教程之输入输出和运算符
Jul 26 Python
pycharm 如何取消连按两下shift出现的全局搜索
Jan 15 Python
python time.strptime格式化实例详解
Feb 03 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
php GD绘制24小时柱状图
2008/06/28 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
2015/02/05 Javascript
javascript中的正则表达式使用详解
2015/08/30 Javascript
Angular JS数据的双向绑定详解及实例
2016/12/31 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
Vue实现active点击切换方法
2018/03/16 Javascript
vue和webpack打包项目相对路径修改的方法
2018/06/15 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
Python扩展内置类型详解
2018/03/26 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
如何使用python操作vmware
2019/07/27 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
信息专业个人的自我评价
2013/12/27 职场文书
简历自我评价怎么写好呢?
2014/01/04 职场文书
火灾现场处置方案
2014/05/28 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS