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使用PyGreSQL操作PostgreSQL数据库教程
Jul 30 Python
基于python socketserver框架全面解析
Sep 21 Python
python 反向输出字符串的方法
Jul 16 Python
Python递归函数实例讲解
Feb 27 Python
python实现海螺图片的方法示例
May 12 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
python读取tif图片时保留其16bit的编码格式实例
Jan 13 Python
pytorch 中的重要模块化接口nn.Module的使用
Apr 02 Python
Django model class Meta原理解析
Nov 14 Python
pycharm中leetcode插件使用图文详解
Dec 07 Python
Python Pandas解析读写 CSV 文件
宝塔更新Python及Flask项目的部署
python模板入门教程之flask Jinja
使用Python解决图表与画布的间距问题
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
You might like
初品cakephp 入门基础
2012/02/16 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
php写的AES加密解密类分享
2014/06/20 PHP
php实现随机显示图片方法汇总
2015/05/21 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
2013/01/09 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
JavaScript浮点数及运算精度调整详解
2016/10/21 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
Express结合Webpack的全栈自动刷新
2019/05/23 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
Python多进程分块读取超大文件的方法
2016/04/13 Python
Python爬豆瓣电影实例
2018/02/23 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
2018/05/02 Python
Selenium鼠标与键盘事件常用操作方法示例
2018/08/13 Python
python调用百度REST API实现语音识别
2018/08/30 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
Python绘制组合图的示例
2020/09/18 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
出纳岗位职责模板
2013/11/27 职场文书
债务授权委托书范本
2014/10/17 职场文书
个人贷款收入证明
2014/10/26 职场文书
会计工作能力自我评价
2015/03/05 职场文书
就业意向书范本
2015/05/11 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏