Python同步方法變?yōu)楫惒椒椒ǖ男〖记煞窒?/h1>
更新時(shí)間:2022年04月11日 17:07:38 作者:米洛丶
同步和異步關(guān)注的是消息通信機(jī)制,下面這篇文章主要給大家介紹了關(guān)于Python同步方法變?yōu)楫惒椒椒ǖ南嚓P(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
背景
在我們平時(shí)的FastApi工作中,經(jīng)常會(huì)用到一些異步的操作,為了保持一致,我們一般會(huì)編寫配套的異步代碼。
但如果我們提供了類似jmeter BeanShell的可執(zhí)行代碼的功能給用戶,那用戶還能給你編寫異步代碼嗎?那顯然是不可能的事情。
還有一種情況,當(dāng)我們引入第三方包,比如一些oss的庫,里面天然是同步方法,有內(nèi)置的requests請(qǐng)求,你想不阻塞整個(gè)fastapi服務(wù),也是需要將他們異步化的。
怎么做?
這塊先給我點(diǎn)時(shí)間去調(diào)研,我暫時(shí)還沒有完全玩明白里面的內(nèi)容。初步的設(shè)想是通過loop.run_in_executor執(zhí)行同步代碼,讓他超乎三界之外,不讓其阻塞事件循環(huán)。
由于還不是很確定,所以會(huì)在后面理解清楚了補(bǔ)充進(jìn)來。那就沒有現(xiàn)成的方案嗎?答案是有的,想做這件事情的,不只是我哦!
為此我調(diào)研了幾個(gè)庫,它們都能很好地解決這個(gè)問題。下面我們來一一介紹。
Asyncer
先上地址: asyncer.tiangolo.com/
這是大名鼎鼎的FastApi的作者,休閑娛樂的時(shí)候?qū)懙囊豢罟ぞ?,它不僅可以把同步代碼異步化,還可以把異步代碼同步化,我們來看看介紹。

簡(jiǎn)單看下,上面的同步方法(內(nèi)部用了sleep)在asyncify的包裹下,變成了awaitable的方法,即異步化。不過由于我沒有真實(shí)使用,看在作者的面上,給個(gè)推薦。
AnyIO.run,因?yàn)檫@個(gè)庫基于AnyIO而編寫的(又是個(gè)奇怪的知識(shí)點(diǎn)),我想應(yīng)該和asyncio.run差不多療效。
總之,既然作者的介紹是符合我們預(yù)期的,我們就推薦一下。
pip install asyncer
awaitable
這個(gè)庫挺不錯(cuò)的,是一個(gè)烏拉老哥寫的。里面充斥著我看不懂的俄語注釋,但我試過功能比較完善,也很容易上手,不信咱們看看:
- 安裝
pip install awaits
- 使用

和上面的區(qū)別在于,他只是把同步方法裝飾起來,就可以當(dāng)異步方法用了,是不是非常神奇!
我測(cè)試過,療效不錯(cuò)。因?yàn)樗簿邆洚惒椒椒ǖ钠渌匦裕热缛∠?。具體可以參考下我對(duì)下面那個(gè)庫介紹的圖片示例代碼。
aioify
這個(gè)是我接觸過的第一個(gè)同步轉(zhuǎn)異步的庫,為此我還為它提過issue。圖里面是我測(cè)試一個(gè)同步方法異步化以后,能不能做取消類似的操作。這個(gè)是我用來判斷它是否阻塞的一個(gè)因素。

最開始我是發(fā)現(xiàn),如果遇到time.sleep
這樣的同步方法,這個(gè)方法似乎沒有起到作用,也就是依舊會(huì)阻塞,后面這個(gè)庫的作者給我答復(fù),大意是重新搞了一下,我可以按照預(yù)期去做了。不過我現(xiàn)在還沒有嘗試過,試著閱讀過源碼,無疾而終了。
pip install aioify
最后,我仔細(xì)閱讀了awaitable的源碼,比較簡(jiǎn)短,如果有時(shí)間我會(huì)仔細(xì)講一下。更重點(diǎn)的是,我要去調(diào)研下開篇說的部分。大家也可以勇敢點(diǎn)嘗試下文中介紹的幾個(gè)庫。
總結(jié)
到此這篇關(guān)于Python同步方法變?yōu)楫惒椒椒ǖ奈恼戮徒榻B到這了,更多相關(guān)Python同步方法變異步方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
-
Python數(shù)學(xué)建模學(xué)習(xí)模擬退火算法約束條件處理示例解析
線性規(guī)劃(Linear programming),是研究線性約束條件下線性目標(biāo)函數(shù)的極值問題的優(yōu)化方法,常用于解決利用現(xiàn)有的資源得到最優(yōu)決策的問題,本文使用懲罰函數(shù)法,分析模擬退火算法處理線性規(guī)劃問題,相關(guān)內(nèi)容也適用于非線性規(guī)劃問題 2021-10-10
-
python實(shí)現(xiàn)Adapter模式實(shí)例代碼
這篇文章主要介紹了python實(shí)現(xiàn)Adapter模式實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下 2018-02-02
-
python數(shù)據(jù)類型bytes?和?bytearray的使用與區(qū)別
本文主要介紹了python數(shù)據(jù)類型bytes?和?bytearray的使用與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2022-02-02
-
python3解析庫BeautifulSoup4的安裝配置與基本用法
簡(jiǎn)單來說,BeautifulSoup就是Python的一個(gè)HTML或XML的解析庫,我們可以用它來方便地從網(wǎng)頁中提取數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于python3解析庫BeautifulSoup4的安裝配置與基本用法的相關(guān)資料,需要的朋友可以參考下 2018-06-06
-
Flask之請(qǐng)求鉤子的實(shí)現(xiàn)
這篇文章主要介紹了Flask之請(qǐng)求鉤子的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧 2018-12-12
-
利用Pandas和Numpy按時(shí)間戳將數(shù)據(jù)以Groupby方式分組
這篇文章主要介紹了利用Pandas和Numpy按時(shí)間戳將數(shù)據(jù)以Groupby方式分組,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧 2019-07-07
最新評(píng)論
背景
在我們平時(shí)的FastApi工作中,經(jīng)常會(huì)用到一些異步的操作,為了保持一致,我們一般會(huì)編寫配套的異步代碼。
但如果我們提供了類似jmeter BeanShell的可執(zhí)行代碼的功能給用戶,那用戶還能給你編寫異步代碼嗎?那顯然是不可能的事情。
還有一種情況,當(dāng)我們引入第三方包,比如一些oss的庫,里面天然是同步方法,有內(nèi)置的requests請(qǐng)求,你想不阻塞整個(gè)fastapi服務(wù),也是需要將他們異步化的。
怎么做?
這塊先給我點(diǎn)時(shí)間去調(diào)研,我暫時(shí)還沒有完全玩明白里面的內(nèi)容。初步的設(shè)想是通過loop.run_in_executor執(zhí)行同步代碼,讓他超乎三界之外,不讓其阻塞事件循環(huán)。
由于還不是很確定,所以會(huì)在后面理解清楚了補(bǔ)充進(jìn)來。那就沒有現(xiàn)成的方案嗎?答案是有的,想做這件事情的,不只是我哦!
為此我調(diào)研了幾個(gè)庫,它們都能很好地解決這個(gè)問題。下面我們來一一介紹。
Asyncer
先上地址: asyncer.tiangolo.com/
這是大名鼎鼎的FastApi的作者,休閑娛樂的時(shí)候?qū)懙囊豢罟ぞ?,它不僅可以把同步代碼異步化,還可以把異步代碼同步化,我們來看看介紹。
簡(jiǎn)單看下,上面的同步方法(內(nèi)部用了sleep)在asyncify的包裹下,變成了awaitable的方法,即異步化。不過由于我沒有真實(shí)使用,看在作者的面上,給個(gè)推薦。
AnyIO.run,因?yàn)檫@個(gè)庫基于AnyIO而編寫的(又是個(gè)奇怪的知識(shí)點(diǎn)),我想應(yīng)該和asyncio.run差不多療效。
總之,既然作者的介紹是符合我們預(yù)期的,我們就推薦一下。
pip install asyncer
awaitable
這個(gè)庫挺不錯(cuò)的,是一個(gè)烏拉老哥寫的。里面充斥著我看不懂的俄語注釋,但我試過功能比較完善,也很容易上手,不信咱們看看:
- 安裝
pip install awaits
- 使用
和上面的區(qū)別在于,他只是把同步方法裝飾起來,就可以當(dāng)異步方法用了,是不是非常神奇!
我測(cè)試過,療效不錯(cuò)。因?yàn)樗簿邆洚惒椒椒ǖ钠渌匦裕热缛∠?。具體可以參考下我對(duì)下面那個(gè)庫介紹的圖片示例代碼。
aioify
這個(gè)是我接觸過的第一個(gè)同步轉(zhuǎn)異步的庫,為此我還為它提過issue。圖里面是我測(cè)試一個(gè)同步方法異步化以后,能不能做取消類似的操作。這個(gè)是我用來判斷它是否阻塞的一個(gè)因素。
最開始我是發(fā)現(xiàn),如果遇到time.sleep
這樣的同步方法,這個(gè)方法似乎沒有起到作用,也就是依舊會(huì)阻塞,后面這個(gè)庫的作者給我答復(fù),大意是重新搞了一下,我可以按照預(yù)期去做了。不過我現(xiàn)在還沒有嘗試過,試著閱讀過源碼,無疾而終了。
pip install aioify
最后,我仔細(xì)閱讀了awaitable的源碼,比較簡(jiǎn)短,如果有時(shí)間我會(huì)仔細(xì)講一下。更重點(diǎn)的是,我要去調(diào)研下開篇說的部分。大家也可以勇敢點(diǎn)嘗試下文中介紹的幾個(gè)庫。
總結(jié)
到此這篇關(guān)于Python同步方法變?yōu)楫惒椒椒ǖ奈恼戮徒榻B到這了,更多相關(guān)Python同步方法變異步方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python數(shù)學(xué)建模學(xué)習(xí)模擬退火算法約束條件處理示例解析
線性規(guī)劃(Linear programming),是研究線性約束條件下線性目標(biāo)函數(shù)的極值問題的優(yōu)化方法,常用于解決利用現(xiàn)有的資源得到最優(yōu)決策的問題,本文使用懲罰函數(shù)法,分析模擬退火算法處理線性規(guī)劃問題,相關(guān)內(nèi)容也適用于非線性規(guī)劃問題2021-10-10python實(shí)現(xiàn)Adapter模式實(shí)例代碼
這篇文章主要介紹了python實(shí)現(xiàn)Adapter模式實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02python數(shù)據(jù)類型bytes?和?bytearray的使用與區(qū)別
本文主要介紹了python數(shù)據(jù)類型bytes?和?bytearray的使用與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02python3解析庫BeautifulSoup4的安裝配置與基本用法
簡(jiǎn)單來說,BeautifulSoup就是Python的一個(gè)HTML或XML的解析庫,我們可以用它來方便地從網(wǎng)頁中提取數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于python3解析庫BeautifulSoup4的安裝配置與基本用法的相關(guān)資料,需要的朋友可以參考下2018-06-06Flask之請(qǐng)求鉤子的實(shí)現(xiàn)
這篇文章主要介紹了Flask之請(qǐng)求鉤子的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12利用Pandas和Numpy按時(shí)間戳將數(shù)據(jù)以Groupby方式分組
這篇文章主要介紹了利用Pandas和Numpy按時(shí)間戳將數(shù)據(jù)以Groupby方式分組,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07