在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基础教程之实现石头剪刀布游戏示例
Feb 11 Python
让python同时兼容python2和python3的8个技巧分享
Jul 11 Python
简单实现python爬虫功能
Dec 31 Python
python的多重继承的理解
Aug 06 Python
python 中的int()函数怎么用
Oct 17 Python
解决python写入mysql中datetime类型遇到的问题
Jun 21 Python
实例讲解python中的协程
Oct 08 Python
python爬取cnvd漏洞库信息的实例
Feb 14 Python
详解Python静态网页爬取获取高清壁纸
Apr 23 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
Python lambda表达式filter、map、reduce函数用法解析
Sep 11 Python
python读取excel数据并且画图的实现示例
Feb 08 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中call_user_func_array的作用
2013/06/07 PHP
关于crontab的使用详解
2013/06/24 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
Javascript的一种模块模式
2008/03/22 Javascript
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
关于JavaScript的一些看法
2009/05/27 Javascript
javascript 类型判断代码分析
2010/03/28 Javascript
js模拟类继承小例子
2010/07/17 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
浅析jQuery EasyUI中的tree使用指南
2014/12/18 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
JS实现数字格式千分位相互转换方法
2016/08/01 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
Element Notification通知的实现示例
2020/07/27 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
Python下载懒人图库JavaScript特效
2015/05/28 Python
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
python3利用tcp实现文件夹远程传输
2018/07/28 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
anaconda3安装及jupyter环境配置全教程
2020/08/24 Python
保卫科工作岗位职责
2014/03/01 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
企业财务管理制度范本
2015/08/04 职场文书
公司晚会主持词
2019/04/17 职场文书
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript