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去除文件中空格、Tab及回车的方法
Apr 12 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
用Django实现一个可运行的区块链应用
Mar 08 Python
python实现决策树ID3算法的示例代码
May 30 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 Python
Python values()与itervalues()的用法详解
Nov 27 Python
python利用opencv保存、播放视频
Nov 02 Python
python 解决函数返回return的问题
Dec 05 Python
Python编写万花尺图案实例
Jan 03 Python
发工资啦!教你用Python实现邮箱自动群发工资条
May 10 Python
Python Pandas解析读写 CSV 文件
宝塔更新Python及Flask项目的部署
python模板入门教程之flask Jinja
使用Python解决图表与画布的间距问题
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
You might like
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
常用的PHP数据库操作方法(MYSQL版)
2011/06/08 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
JS实现“全选”和"全不选"功能代码实例
2020/02/06 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
Python创建日历实例
2014/08/21 Python
python中zip()方法应用实例分析
2016/04/16 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
python 限制函数执行时间,自己实现timeout的实例
2019/01/12 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
作文评语大全
2014/04/23 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫