最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于fastapi異步接口卡死的坑及解決

 更新時(shí)間:2024年06月29日 08:38:24   作者:brandon_l  
這篇文章主要介紹了關(guān)于fastapi異步接口卡死的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

背景

開(kāi)發(fā)任務(wù)是使用fastapi去寫(xiě)一個(gè)對(duì)工業(yè)設(shè)備(PLC)的通信接口,方便其他后端服務(wù)與設(shè)備對(duì)接,將設(shè)備的功能抽象出來(lái)供MES調(diào)用。

通信協(xié)議是使用modbus TCP,由于fastapi是異步框架,很多以前在同步函數(shù)里開(kāi)發(fā)的代碼移植過(guò)來(lái)發(fā)現(xiàn)出現(xiàn)了異常,這也是不斷踩坑的過(guò)程,問(wèn)題解決之后也能體會(huì)到異步框架的優(yōu)美與高效。

問(wèn)題細(xì)節(jié)

在視圖函數(shù)中我們需要?jiǎng)?chuàng)建一個(gè)socket連接,使用它跟plc進(jìn)行通信,完畢之后還要記得關(guān)閉該連接,否則就會(huì)造成異步框架的卡死,其他請(qǐng)求就進(jìn)不來(lái)了。

剛開(kāi)始我的代碼是這樣的:

@router.put("/start/{id}")
async def start(
    id:int,
    batsize:int=Body(default=15,description='批次大小'),
    noksize:int=Body(default=3,description='最大連續(xù)失敗次數(shù)')
    ):

    dip = await PLC.get(pk=id)   # 配置數(shù)據(jù)庫(kù)中查詢?cè)O(shè)備網(wǎng)絡(luò)信息
    zmqconn = get_conn(dip.host,dip.port)   # 獲取網(wǎng)絡(luò)連接
    # 發(fā)送命令
    try:
        ret = zmqconn.request(action='start_batch',rqargs={'batch_size':batsize,'nok_num':noksize})
    except Exception as e:
        raise HTTPException(status_code=503,detail=str(e))
    else:
        return ret

????寫(xiě)完之后我自己測(cè)試了一下,發(fā)現(xiàn)是可以正常發(fā)起命令的,而且接口也返回了期望的結(jié)果,但是我快速點(diǎn)了幾下,發(fā)現(xiàn)問(wèn)題就來(lái)了,第六下的時(shí)候,接口卡住無(wú)法返回,異步函數(shù)中也不執(zhí)行任何動(dòng)作,這在之前的同步代碼中是沒(méi)有出現(xiàn)的。

后來(lái)我經(jīng)過(guò)調(diào)試發(fā)現(xiàn)是socket連接并沒(méi)有成功創(chuàng)建,懷疑是之前的連接沒(méi)有關(guān)閉,導(dǎo)致了網(wǎng)絡(luò)阻塞,于是加入了關(guān)閉連接的代碼。

@router.put("/start/{id}")
async def start(
    id:int,
    batsize:int=Body(default=15,description='批次大小'),
    noksize:int=Body(default=3,description='最大連續(xù)失敗次數(shù)')
    ):

    dip = await PLC.get(pk=id)
    zmqconn = get_conn(dip.host,dip.port)
        
    try:
        ret = zmqconn.request(action='start_batch',rqargs={'batch_size':batsize,'nok_num':noksize})
    except Exception as e:
        raise HTTPException(status_code=503,detail=str(e))
    finally:
        zmqconn.close()
    return ret

這個(gè)時(shí)候就完全沒(méi)有卡住的問(wèn)題了,接口可以一直點(diǎn)。

所以對(duì)于異步函數(shù),我們一定要注意手動(dòng)釋放資源,否則可能會(huì)造成意想不到的問(wèn)題。

fastapi依賴注入

但是這又出現(xiàn)一個(gè)問(wèn)題,我們的服務(wù)是經(jīng)常用到前面的socket框架的,其他接口也要用到,總不能每個(gè)接口都把這段代碼復(fù)制粘貼一邊吧。

fastapi作為最優(yōu)秀的異步框架,有一個(gè)很大的特點(diǎn)就是非??量痰拇a復(fù)用性,它在設(shè)計(jì)的時(shí)候考慮到了重復(fù)代碼的問(wèn)題。

至于苛刻到什么程度呢,舉個(gè)例子,如果不同的接口用了相同的一組參數(shù),那么你可以把這組參數(shù)進(jìn)行封裝,寫(xiě)到依賴?yán)锩?,用的時(shí)候引入一下,那么你新的接口就有了一組一模一樣的參數(shù)。

這里我們利用fastapi的依賴注入,把接口參數(shù)以及socket連接都封裝起來(lái),供其他接口調(diào)用。

依賴代碼

async def get_conn_dep(
    id:int = Path(description='路徑參數(shù),設(shè)備id'),
):
    dip = await PLC.get(pk=id)
    try:
        zmqconn = get_conn(dip.host,dip.port)
        yield zmqconn                # 向接口函數(shù)注入鏈接
    finally:
        zmqconn.close()     # 接口函數(shù)執(zhí)行完畢后會(huì)異步執(zhí)行關(guān)閉

而我們的接口函數(shù)就可以非常精簡(jiǎn)

@router.put("/start/{id}")
async def start(
    zmqconn = Depends(get_conn_dep),     # 這一行直接復(fù)用了一堆代碼以及相應(yīng)的路徑字段,簡(jiǎn)直太優(yōu)雅了
    batsize:int=Body(default=15,description='批次大小'),
    noksize:int=Body(default=3,description='最大連續(xù)失敗次數(shù)')
    ):

    try:
        ret = zmqconn.request(action='start_batch',rqargs={'batch_size':batsize,'nok_num':noksize})
    except Exception as e:
        raise HTTPException(status_code=503,detail=str(e))
    else:
        return ret

我們使用swagger瘋狂點(diǎn)擊該接口,并傳入不同的參數(shù)進(jìn)行測(cè)試,發(fā)現(xiàn)接口響應(yīng)非常流暢,異常處理的時(shí)候也返回了我們想要的錯(cuò)誤信息。

我們上面的代碼使用了fastapi異步接口(據(jù)說(shuō)性能逼近go),并使用了tortoise異步ORM,tortoise的使用與django-orm幾乎一樣,但它是一個(gè)純異步orm,這兩個(gè)配合起來(lái)開(kāi)發(fā)簡(jiǎn)直是非常的舒服。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • pandas or sql計(jì)算前后兩行數(shù)據(jù)間的增值方法

    pandas or sql計(jì)算前后兩行數(shù)據(jù)間的增值方法

    下面小編就為大家分享一篇pandas or sql計(jì)算前后兩行數(shù)據(jù)間的增值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python導(dǎo)入模塊的3種方式小結(jié)

    Python導(dǎo)入模塊的3種方式小結(jié)

    本文主要介紹了Python導(dǎo)入模塊的3種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Python生成requirements.txt的三種方法

    Python生成requirements.txt的三種方法

    requirements.txt?文件通常用于列出項(xiàng)目所需的所有Python包及其版本,本文主要介紹了Python生成requirements.txt的三種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • unittest+coverage單元測(cè)試代碼覆蓋操作實(shí)例詳解

    unittest+coverage單元測(cè)試代碼覆蓋操作實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了unittest+coverage單元測(cè)試代碼覆蓋操作的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 一文詳解Python的pyc文件

    一文詳解Python的pyc文件

    Python?程序在執(zhí)行過(guò)程中,會(huì)產(chǎn)生一些中間文件,其中最常見(jiàn)的就是?pyc?文件,pyc?文件是?Python?的二進(jìn)制字節(jié)碼文件,本文將通過(guò)簡(jiǎn)潔的語(yǔ)言、實(shí)際的代碼和案例,通俗易懂地解釋?pyc?文件的相關(guān)知識(shí),感興趣的小伙伴跟著小編一起來(lái)看看吧
    2024-12-12
  • 使用Python的package機(jī)制如何簡(jiǎn)化utils包設(shè)計(jì)詳解

    使用Python的package機(jī)制如何簡(jiǎn)化utils包設(shè)計(jì)詳解

    這篇文章主要給大家介紹了關(guān)于使用Python的package機(jī)制如何簡(jiǎn)化utils包設(shè)計(jì)的相關(guān)資料,文中通過(guò)示例代碼的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-12-12
  • Django中外鍵使用總結(jié)

    Django中外鍵使用總結(jié)

    本文主要介紹了Django中外鍵使用總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Python竟能畫(huà)這么漂亮的花,帥呆了(代碼分享)

    Python竟能畫(huà)這么漂亮的花,帥呆了(代碼分享)

    這篇文章主要介紹了用Python作圖的一個(gè)簡(jiǎn)單實(shí)例,通過(guò)turtle模塊實(shí)現(xiàn)作圖,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Python實(shí)現(xiàn)爬取網(wǎng)頁(yè)中動(dòng)態(tài)加載的數(shù)據(jù)

    Python實(shí)現(xiàn)爬取網(wǎng)頁(yè)中動(dòng)態(tài)加載的數(shù)據(jù)

    這篇文章主要介紹了Python實(shí)現(xiàn)爬取網(wǎng)頁(yè)中動(dòng)態(tài)加載的數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 一篇文章學(xué)會(huì)兩種將python打包成exe的方式

    一篇文章學(xué)會(huì)兩種將python打包成exe的方式

    最近有部分小伙伴問(wèn)我,python 寫(xiě)的項(xiàng)目可不可以打包成exe程序,放到?jīng)]有python環(huán)境上的電腦中執(zhí)行? 答案當(dāng)然是可以的,下面這篇文章主要給大家介紹了如何通過(guò)一篇文章學(xué)會(huì)兩種將pyton打包成exe的方式,需要的朋友可以參考下
    2021-11-11

最新評(píng)論

巴林右旗| 济宁市| 江阴市| 寻甸| 建平县| 四会市| 达尔| 游戏| 万年县| 达孜县| 阜新| 改则县| 滦平县| 麦盖提县| 泊头市| 阿拉尔市| 开鲁县| 藁城市| 平谷区| 北安市| 张北县| 独山县| 萨嘎县| 田东县| 确山县| 太湖县| 克山县| 绥江县| 巧家县| 丽水市| 和平区| 安丘市| 凤城市| 惠州市| 玉屏| 保靖县| 东宁县| 徐闻县| 柳林县| 开阳县| 五大连池市|