在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分割和拼接字符串
Nov 01 Python
Python中还原JavaScript的escape函数编码后字符串的方法
Aug 22 Python
在Python编程过程中用单元测试法调试代码的介绍
Apr 02 Python
Python求导数的方法
May 09 Python
Python 中 Virtualenv 和 pip 的简单用法详解
Aug 18 Python
基于python socketserver框架全面解析
Sep 21 Python
tensorflow实现softma识别MNIST
Mar 12 Python
Python 的AES加密与解密实现
Jul 09 Python
使用pyqt5 tablewidget 单元格设置正则表达式
Dec 13 Python
windows10在visual studio2019下配置使用openCV4.3.0
Jul 14 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
Aug 22 Python
python3中编码获取网页的实例方法
Nov 16 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
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
点击表单提交时出现jQuery没有权限的解决方法
2014/07/23 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
js 开发之autocomplete="off"在chrom中失效的解决办法
2017/09/28 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
vue父组件给子组件的组件传值provide inject的方法
2019/10/23 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
浅析Python中字符串的intern机制
2020/10/03 Python
HTML5实现锚点时请使用id取代name
2013/09/06 HTML / CSS
学生发电厂实习自我鉴定
2013/09/22 职场文书
网上卖盒饭创业计划书范文
2014/02/07 职场文书
私人会所最新创业计划书范文
2014/03/24 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
安全演讲稿开场白
2014/08/25 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
初中信息技术教学计划
2015/01/22 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
办公室日常管理制度
2015/08/04 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书