網(wǎng)站首頁 編程語言 正文
背景
在我們平時的FastApi工作中,經(jīng)常會用到一些異步的操作,為了保持一致,我們一般會編寫配套的異步代碼。
但如果我們提供了類似jmeter BeanShell的可執(zhí)行代碼的功能給用戶,那用戶還能給你編寫異步代碼嗎?那顯然是不可能的事情。
還有一種情況,當(dāng)我們引入第三方包,比如一些oss的庫,里面天然是同步方法,有內(nèi)置的requests請求,你想不阻塞整個fastapi服務(wù),也是需要將他們異步化的。
怎么做?
這塊先給我點時間去調(diào)研,我暫時還沒有完全玩明白里面的內(nèi)容。初步的設(shè)想是通過loop.run_in_executor執(zhí)行同步代碼,讓他超乎三界之外,不讓其阻塞事件循環(huán)。
由于還不是很確定,所以會在后面理解清楚了補充進(jìn)來。那就沒有現(xiàn)成的方案嗎?答案是有的,想做這件事情的,不只是我哦!
為此我調(diào)研了幾個庫,它們都能很好地解決這個問題。下面我們來一一介紹。
Asyncer
先上地址: asyncer.tiangolo.com/
這是大名鼎鼎的FastApi的作者,休閑娛樂的時候?qū)懙囊豢罟ぞ撸粌H可以把同步代碼異步化,還可以把異步代碼同步化,我們來看看介紹。
簡單看下,上面的同步方法(內(nèi)部用了sleep)在asyncify的包裹下,變成了awaitable的方法,即異步化。不過由于我沒有真實使用,看在作者的面上,給個推薦。
AnyIO.run,因為這個庫基于AnyIO而編寫的(又是個奇怪的知識點),我想應(yīng)該和asyncio.run差不多療效。
總之,既然作者的介紹是符合我們預(yù)期的,我們就推薦一下。
pip install asyncer
awaitable
這個庫挺不錯的,是一個烏拉老哥寫的。里面充斥著我看不懂的俄語注釋,但我試過功能比較完善,也很容易上手,不信咱們看看:
- 安裝
pip install awaits
- 使用
和上面的區(qū)別在于,他只是把同步方法裝飾起來,就可以當(dāng)異步方法用了,是不是非常神奇!
我測試過,療效不錯。因為它也具備異步方法的其他特性,比如取消。具體可以參考下我對下面那個庫介紹的圖片示例代碼。
aioify
這個是我接觸過的第一個同步轉(zhuǎn)異步的庫,為此我還為它提過issue。圖里面是我測試一個同步方法異步化以后,能不能做取消類似的操作。這個是我用來判斷它是否阻塞的一個因素。
最開始我是發(fā)現(xiàn),如果遇到time.sleep
這樣的同步方法,這個方法似乎沒有起到作用,也就是依舊會阻塞,后面這個庫的作者給我答復(fù),大意是重新搞了一下,我可以按照預(yù)期去做了。不過我現(xiàn)在還沒有嘗試過,試著閱讀過源碼,無疾而終了。
pip install aioify
最后,我仔細(xì)閱讀了awaitable的源碼,比較簡短,如果有時間我會仔細(xì)講一下。更重點的是,我要去調(diào)研下開篇說的部分。大家也可以勇敢點嘗試下文中介紹的幾個庫。
總結(jié)
原文鏈接:https://juejin.cn/post/7084213927311048740
相關(guān)推薦
- 2022-09-05 Pycharm虛擬環(huán)境pip時報錯:no?suchoption:--bulid-dir的解決辦法_p
- 2022-06-21 C語言詳解如何實現(xiàn)帶頭雙向循環(huán)鏈表_C 語言
- 2022-08-30 Linux常用tar命令
- 2022-08-27 Python+matplotlib繪制多子圖的方法詳解_python
- 2022-06-28 python神經(jīng)網(wǎng)絡(luò)使用Keras進(jìn)行模型的保存與讀取_python
- 2022-12-10 C語言實現(xiàn)十六進(jìn)制與二進(jìn)制的相互轉(zhuǎn)換_C 語言
- 2022-11-02 Android三方依賴沖突Gradle中exclude的使用_Android
- 2022-07-01 淺談C語言中的sizeof()和strlen()的區(qū)別_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支