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中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 Python
对python中的xlsxwriter库简单分析
May 04 Python
Python退火算法在高次方程的应用
Jul 26 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
May 07 Python
对Django url的几种使用方式详解
Aug 06 Python
在Python中实现函数重载的示例代码
Dec 12 Python
python每5分钟从kafka中提取数据的例子
Dec 23 Python
Python如何使用turtle库绘制图形
Feb 26 Python
keras:model.compile损失函数的用法
Jul 01 Python
python 制作网站小说下载器
Feb 20 Python
利用Python实现模拟登录知乎
May 25 Python
Python Pandas解析读写 CSV 文件
宝塔更新Python及Flask项目的部署
python模板入门教程之flask Jinja
使用Python解决图表与画布的间距问题
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
You might like
一个高ai的分页函数和一个url函数
2006/10/09 PHP
PHP XML数据解析代码
2010/05/26 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
php实现文件编码批量转换
2014/03/10 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
详解PHP PDO简单教程
2019/05/28 PHP
Yii框架函数简单用法分析
2019/09/09 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
Python 字符串操作方法大全
2014/03/11 Python
python字典序问题实例
2014/09/26 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
Django框架封装外部函数示例
2019/05/28 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
2020/11/13 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
德国机场停车位比较和预订网站:Ich-parke-billiger
2018/01/08 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
伊索寓言教学反思
2014/05/01 职场文书