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 相关文章推荐
在Django中进行用户注册和邮箱验证的方法
May 09 Python
Python实现Linux中的du命令
Jun 12 Python
python下setuptools的安装详解及No module named setuptools的解决方法
Jul 06 Python
python tornado微信开发入门代码
Aug 24 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
python 读取鼠标点击坐标的实例
Dec 29 Python
通过PHP与Python代码对比的语法差异详解
Jul 10 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
Python3 读取Word文件方式
Feb 13 Python
python标准库OS模块函数列表与实例全解
Mar 10 Python
Python HTMLTestRunner库安装过程解析
May 25 Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 Python
Python Pandas解析读写 CSV 文件
宝塔更新Python及Flask项目的部署
python模板入门教程之flask Jinja
使用Python解决图表与画布的间距问题
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
You might like
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
浅析jquery与checkbox的checked属性的问题
2016/04/27 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
2016/08/01 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
基于django传递数据到后端的例子
2019/08/16 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
Django框架请求生命周期实现原理
2020/11/13 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
图书室管理制度
2014/01/19 职场文书
建筑个人求职信范文
2014/01/25 职场文书
致标枪运动员广播稿
2014/02/06 职场文书
敬老模范事迹
2014/05/21 职场文书
市委常委会班子党的群众路线教育实践活动整改方案
2014/10/25 职场文书
党校个人总结
2015/03/04 职场文书
长征观后感
2015/06/09 职场文书
三八节活动简报
2015/07/20 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
2019感恩宣传标语!
2019/07/05 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android