Python通过loop.run_in_executor执行同步代码 同步变为异步

Python小技巧之同步方法变为异步方法

Posted in Python onApril 11, 2022

背景

在我们平时的FastApi工作中,经常会用到一些异步的操作,为了保持一致,我们一般会编写配套的异步代码。

但如果我们提供了类似jmeter BeanShell的可执行代码的功能给用户,那用户还能给你编写异步代码吗?那显然是不可能的事情。

还有一种情况,当我们引入第三方包,比如一些oss的库,里面天然是同步方法,有内置的requests请求,你想不阻塞整个fastapi服务,也是需要将他们异步化的。

怎么做?

这块先给我点时间去调研,我暂时还没有完全玩明白里面的内容。初步的设想是通过loop.run_in_executor执行同步代码,让他超乎三界之外,不让其阻塞事件循环。

由于还不是很确定,所以会在后面理解清楚了补充进来。那就没有现成的方案吗?答案是有的,想做这件事情的,不只是我哦!

为此我调研了几个库,它们都能很好地解决这个问题。下面我们来一一介绍。

Asyncer

先上地址: asyncer.tiangolo.com/

这是大名鼎鼎的FastApi的作者,休闲娱乐的时候写的一款工具,它不仅可以把同步代码异步化,还可以把异步代码同步化,我们来看看介绍。

Python通过loop.run_in_executor执行同步代码 同步变为异步

简单看下,上面的同步方法(内部用了sleep)在asyncify的包裹下,变成了awaitable的方法,即异步化。不过由于我没有真实使用,看在作者的面上,给个推荐。

AnyIO.run,因为这个库基于AnyIO而编写的(又是个奇怪的知识点),我想应该和asyncio.run差不多疗效。

总之,既然作者的介绍是符合我们预期的,我们就推荐一下。

pip install asyncer

awaitable

这个库挺不错的,是一个乌拉老哥写的。里面充斥着我看不懂的俄语注释,但我试过功能比较完善,也很容易上手,不信咱们看看:

  • 安装
pip install awaits
  • 使用

Python通过loop.run_in_executor执行同步代码 同步变为异步

和上面的区别在于,他只是把同步方法装饰起来,就可以当异步方法用了,是不是非常神奇!

我测试过,疗效不错。因为它也具备异步方法的其他特性,比如取消。具体可以参考下我对下面那个库介绍的图片示例代码。

aioify

这个是我接触过的第一个同步转异步的库,为此我还为它提过issue。图里面是我测试一个同步方法异步化以后,能不能做取消类似的操作。这个是我用来判断它是否阻塞的一个因素。

Python通过loop.run_in_executor执行同步代码 同步变为异步

最开始我是发现,如果遇到time.sleep这样的同步方法,这个方法似乎没有起到作用,也就是依旧会阻塞,后面这个库的作者给我答复,大意是重新搞了一下,我可以按照预期去做了。不过我现在还没有尝试过,试着阅读过源码,无疾而终了。

pip install aioify

最后,我仔细阅读了awaitable的源码,比较简短,如果有时间我会仔细讲一下。更重点的是,我要去调研下开篇说的部分。大家也可以勇敢点尝试下文中介绍的几个库。

Python 相关文章推荐
给Python初学者的一些编程技巧
Apr 03 Python
windows及linux环境下永久修改pip镜像源的方法
Nov 28 Python
Python中的连接符(+、+=)示例详解
Jan 13 Python
对python生成业务报表的实例详解
Feb 03 Python
Python按钮的响应事件详解
Mar 04 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
如何基于python对接钉钉并获取access_token
Apr 21 Python
Python collections.deque双边队列原理详解
Oct 05 Python
Python爬虫入门教程01之爬取豆瓣Top电影
Jan 24 Python
Python Pandas解析读写 CSV 文件
宝塔更新Python及Flask项目的部署
python模板入门教程之flask Jinja
使用Python解决图表与画布的间距问题
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
You might like
php数组的概述及分类与声明代码演示
2013/02/26 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
document.onreadystatechange事件的用法分析
2009/10/17 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
基于jquery实现弹幕效果
2016/09/29 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
Vue实现购物车详情页面的方法
2019/08/20 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
python对数组进行反转的方法
2015/05/20 Python
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
Java文件和目录(IO)操作
2014/08/26 面试题
英语系本科生求职信范文
2013/12/18 职场文书
市优秀教师事迹材料
2014/02/05 职场文书
新闻传播专业求职信
2014/07/22 职场文书
讲文明倡议书
2015/04/29 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android
Win10服务主机占用内存怎么办?Win10服务主机进程占用大量内存解决方法
2022/09/23 数码科技