在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 getopt 参数处理小示例
Jun 09 Python
python统计cpu利用率的方法
Jun 02 Python
浅谈flask中的before_request与after_request
Jan 20 Python
python的内存管理和垃圾回收机制详解
May 18 Python
python画图——实现在图上标注上具体数值的方法
Jul 08 Python
利用python list完成最简单的DB连接池方法
Aug 09 Python
django有外键关系的两张表如何相互查找
Feb 10 Python
Python生成器next方法和send方法区别详解
May 30 Python
详解python tcp编程
Aug 24 Python
Python Merge函数原理及用法解析
Sep 16 Python
python 读取、写入txt文件的示例
Sep 27 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
Feb 27 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
PL-880隐藏功能
2021/03/01 无线电
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
php htmlspecialchars加强版
2010/02/16 PHP
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
php提取字符串中网站url地址的方法
2014/12/03 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
什么是JavaScript
2009/08/13 Javascript
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
微信小程序CSS3动画下拉菜单效果
2018/11/04 Javascript
vue3+typescript实现图片懒加载插件
2020/10/26 Javascript
python django 访问静态文件出现404或500错误
2017/01/20 Python
Python reversed函数及使用方法解析
2020/03/17 Python
苹果Mac升级:MacSales.com
2017/11/20 全球购物
英文版银行求职信
2013/10/09 职场文书
采购部经理岗位职责
2014/02/10 职场文书
三方合作协议书范本
2014/04/18 职场文书
实习单位指导教师评语
2014/12/30 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript