在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的setuptools框架下生成egg的教程
Apr 13 Python
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
Python使用爬虫爬取静态网页图片的方法详解
Jun 05 Python
基于python的socket实现单机五子棋到双人对战
Mar 24 Python
python设置环境变量的作用和实例
Jul 09 Python
提升Python效率之使用循环机制代替递归函数
Jul 23 Python
Django通过dwebsocket实现websocket的例子
Nov 15 Python
python/Matplotlib绘制复变函数图像教程
Nov 21 Python
python列表返回重复数据的下标
Feb 10 Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 Python
Django model重写save方法及update踩坑详解
Jul 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
Mysql的常用命令
2006/10/09 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
Javascript 作用域使用说明
2009/08/13 Javascript
JS实现简单的图书馆享元模式实例
2015/06/30 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
python进阶教程之词典、字典、dict
2014/08/29 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
Python同步遍历多个列表的示例
2019/02/19 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
Python面向对象之私有属性和私有方法应用案例分析
2019/12/31 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
2014年幼儿园元旦活动方案
2014/02/13 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
医德医风个人总结
2015/02/28 职场文书
七一表彰大会简报
2015/07/20 职场文书
检讨书之工作不认真
2019/08/14 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python