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按照多个字符对字符串进行分割的方法
Mar 17 Python
python实现井字棋游戏
Mar 30 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
Feb 19 Python
Python实现读取Properties配置文件的方法
Mar 29 Python
对numpy中shape的深入理解
Jun 15 Python
django如何通过类视图使用装饰器
Jul 24 Python
一行python实现树形结构的方法
Aug 09 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
学python需要去培训机构吗
Jul 01 Python
通用的Django注册功能模块实现方法
Feb 05 Python
opencv深入浅出了解机器学习和深度学习
Mar 17 Python
python库Tsmoothie模块数据平滑化异常点抓取
Jun 10 Python
Python Pandas解析读写 CSV 文件
宝塔更新Python及Flask项目的部署
python模板入门教程之flask Jinja
使用Python解决图表与画布的间距问题
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
You might like
树型结构列出指定目录里所有文件的PHP类
2006/10/09 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
jQuery UI 应用不同Theme的办法
2010/09/12 Javascript
javascript时区函数介绍
2012/09/14 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
使用js获取图片原始尺寸
2014/12/03 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
基于JavaScript代码实现微信扫一扫下载APP
2015/12/30 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
聊一聊JS中this的指向问题
2016/06/17 Javascript
Angular设置title信息解决SEO方面存在问题
2016/08/19 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
webpack3升级到webpack4遇到问题总结
2019/09/30 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
深入解析Python中的集合类型操作符
2015/08/19 Python
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
python装饰器代替set get方法实例
2019/12/19 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
How TDD works
2012/09/30 面试题
护士辞职信范文
2014/01/19 职场文书
乡村文明行动实施方案
2014/03/29 职场文书
硕士生找工作求职信
2014/07/05 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
建立共青团委员会的请示
2019/04/02 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
浅谈Python数学建模之整数规划
2021/06/23 Python
vue使用element-ui按需引入
2022/05/20 Vue.js