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 相关文章推荐
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
Jun 10 Python
用Python编写一个简单的Lisp解释器的教程
Apr 03 Python
python实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
Python 通配符删除文件的实例
Apr 24 Python
python+selenium打印当前页面的titl和url方法
Jun 22 Python
python代码过长的换行方法
Jul 19 Python
PyQt5显示GIF图片的方法
Jun 17 Python
Python使用正则实现计算字符串算式
Dec 29 Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
Python+Tkinter打造签名设计工具
Apr 01 Python
Python Pandas解析读写 CSV 文件
宝塔更新Python及Flask项目的部署
python模板入门教程之flask Jinja
使用Python解决图表与画布的间距问题
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
You might like
php设计模式  Command(命令模式)
2011/06/17 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
javascript 验证日期的函数
2010/03/18 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
JavaScript实现的联动菜单特效示例
2019/07/08 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
python实现将内容分行输出
2015/11/05 Python
详解Python中的文件操作
2016/08/28 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
Python中无限循环需要什么条件
2020/05/27 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
物业工作计划书
2014/01/10 职场文书
法律进企业活动方案
2014/03/04 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
2019职场单身人才调研报告:互联网行业单身比例最高
2019/08/07 职场文书