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实现注册登录系统
Aug 08 Python
利用Opencv中Houghline方法实现直线检测
Feb 11 Python
tensorflow: 查看 tensor详细数值方法
Jun 13 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
Python进阶之自定义对象实现切片功能
Jan 07 Python
浅谈PySpark SQL 相关知识介绍
Jun 14 Python
python爬虫实现中英翻译词典
Jun 25 Python
获取Pytorch中间某一层权重或者特征的例子
Aug 17 Python
Python 多线程其他属性以及继承Thread类详解
Aug 28 Python
Python中使用gflags实例及原理解析
Dec 13 Python
Python实现打包成库供别的模块调用
Jul 13 Python
Pillow图像处理库安装及使用
Apr 12 Python
Python Pandas解析读写 CSV 文件
宝塔更新Python及Flask项目的部署
python模板入门教程之flask Jinja
使用Python解决图表与画布的间距问题
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
You might like
php 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
Web程序工作原理详解
2014/12/25 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
2015/03/27 PHP
PHP文件上传操作实例详解
2016/09/27 PHP
ext 代码生成器
2009/08/07 Javascript
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
js FLASH幻灯片字符串中有连接符&的处理方法
2012/03/01 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
numpy.random.seed()的使用实例解析
2018/02/03 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
Django xadmin安装及使用详解
2020/10/26 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
求职信需要的五点内容
2014/02/01 职场文书
产品推广策划方案
2014/05/10 职场文书
开幕式邀请函
2015/01/31 职场文书
公司表扬信格式
2015/05/04 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
MySQL 分页查询的优化技巧
2021/05/12 MySQL
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js