在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实现的朴素贝叶斯分类器示例
Jan 06 Python
python实现简单淘宝秒杀功能
May 03 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 Python
解决pandas .to_excel不覆盖已有sheet的问题
Dec 10 Python
python异步实现定时任务和周期任务的方法
Jun 29 Python
python用线性回归预测股票价格的实现代码
Sep 04 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
Python响应对象text属性乱码解决方案
Mar 31 Python
Python内置函数locals和globals对比
Apr 28 Python
Node.js 和 Python之间该选择哪个?
Aug 05 Python
基于python的opencv图像处理实现对斑马线的检测示例
Nov 29 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超全局数组(Superglobals)介绍
2015/07/01 PHP
php-msf源码详解
2017/12/25 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
jQuery操作select的实例代码
2012/06/14 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
用jquery存取照片的具体实现方法
2013/06/30 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
Python实现全局变量的两个解决方法
2014/07/03 Python
python查看zip包中文件及大小的方法
2015/07/09 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
python批量下载抖音视频
2019/06/17 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
Python内置异常类型全面汇总
2020/05/28 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
英国异国风情旅游网站:Travel Talk Tours(团体旅游、探险旅游、帆船假期)
2018/07/26 全球购物
PHP面试题及答案二
2015/05/23 面试题
酒店管理毕业生自荐信
2013/10/24 职场文书
《掌声》教学反思
2014/02/23 职场文书
车队司机自我鉴定
2014/03/02 职场文书
读书演讲主持词
2014/03/18 职场文书
学校与家长安全责任书
2014/07/23 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书