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

python 常用的異步框架匯總整理

 更新時間:2021年06月18日 15:59:36   作者:火腿蛋炒飯  
自從python3推出關(guān)于異步編程的新語法之后,關(guān)于異步web框架也是如雨后春筍一般爆發(fā),關(guān)于 異步框架的性能也日漸激烈。今天就整理關(guān)于 python 的異步框架。

正文開始

asyncio 是 Python 3.4版本引入的標準庫,直接內(nèi)置了對異步IO的支持。

asyncio 在單線程內(nèi)部維護了 EventLoop 隊列,然后把需要執(zhí)行異步IO的任務(wù)添加到 EventLoop 隊列中,至于任務(wù)的完成通過類似回調(diào)的邏輯是實現(xiàn)后續(xù)的任務(wù)。如果你有 JavaScript的基礎(chǔ)那么理解python的 asyncio 很簡單,關(guān)鍵字、語法以及實現(xiàn)的原理都極其類似。

import asyncio

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

# Python 3.7+
asyncio.run(main())

1. Tornado

Tornado 是一個Python web框架和異步網(wǎng)絡(luò)庫,起初由 FriendFeed 開發(fā). 通過使用非阻塞網(wǎng)絡(luò)I/O, Tornado可以支撐上萬級的連接,處理 長連接, WebSockets ,和其他需要與每個用戶保持長久連接的應(yīng)用。

下面貼上官方 demo :

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

2. Aiohttp

一個基于 asyncio 異步的web框架,支持 websocket,不需要寫回掉的代碼、有著豐富的生態(tài)、中間價等、開箱即用的服務(wù)端與客戶端。

下面貼上官方 demo :

# 客服端代碼
import aiohttp
import asyncio

async def main():

    async with aiohttp.ClientSession() as session:
        async with session.get('http://python.org') as response:

            print("Status:", response.status)
            print("Content-type:", response.headers['content-type'])

            html = await response.text()
            print("Body:", html[:15], "...")

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
# 服務(wù)端代碼
from aiohttp import web

async def handle(request):
    name = request.match_info.get('name', "Anonymous")
    text = "Hello, " + name
    return web.Response(text=text)

async def wshandle(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)

    async for msg in ws:
        if msg.type == web.WSMsgType.text:
            await ws.send_str("Hello, {}".format(msg.data))
        elif msg.type == web.WSMsgType.binary:
            await ws.send_bytes(msg.data)
        elif msg.type == web.WSMsgType.close:
            break

    return ws


app = web.Application()
app.add_routes([web.get('/', handle),
                web.get('/echo', wshandle),
                web.get('/{name}', handle)])

if __name__ == '__main__':
    web.run_app(app)

aiohttp的生態(tài):

  • aiohttp-session 為 aiohttp 服務(wù)提供 sessions支持,同時支持數(shù)據(jù)持久化數(shù)據(jù)庫。
  • aiohttp-debugtoolbar 為 aiohttp 提供調(diào)試的工具(記錄 asyncio 異常的堆棧信息)。
  • aiohttp-security 為aiohttp提供認證以及權(quán)限相關(guān)的插件。
  • aiohttp-devtools aiohttp開發(fā)工具,提供開發(fā)環(huán)境的部署、靜態(tài)資源的代理。
  • aiohttp-cors CORS 跨域認證支持。
  • aiohttp-sse 服務(wù)端事件的支持(一種服務(wù)端推送消息的服務(wù))。
  • pytest-aiohttp pytest 測試框架的支持。
  • aiohttp-mako Mako 服務(wù)端模板渲染的支持。
  • aiohttp-jinja2 Jinja2 服務(wù)端模板渲染的支持(大名鼎鼎的flask的渲染引擎)。
  • aiozipkin 分布式系統(tǒng)中對服務(wù)追蹤,為微服務(wù)中延時問題提供數(shù)據(jù)支持。

aiohttp數(shù)據(jù)庫支持:

aiopg PostgreSQL異步支持。
aiomysql MySql 異步支持。
aioredis Redis 異步支持。
asyncpg 另外一個對 PostgreSQL 異步支持,比 aiopg 效率高,但是 api 不通用。

3.Sanic

Sanic 是一個 Python 3.7+ 的基于 asyncio 的 web 服務(wù)器和web框架,目標是提供一種簡單的方法來啟動和運行一個易于構(gòu)建、擴展和終極性能HTTP服務(wù)器,是一個比較類似 falsk 的異步web框架。

To provide a simple way to get up and running a highly performant HTTP server that is easy to build, to expand, and ultimately to scale.

官方demo:

from sanic import Sanic
from sanic.response import json

app = Sanic("My Hello, world app")

@app.route('/')
async def test(request):
    return json({'hello': 'world'})

if __name__ == '__main__':
    app.run()

4. FastAPI

FastAPI 是一個用于構(gòu)建API的高性能web框架,基于Python3.6+并支持標準的 Python 類型提示。同時是最快的 Python web框架之一,可與 NodeJS 和 Go 比肩(主要歸功于 Starlette 和 Pydantic)。

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

# 啟動 uvicorn main:app --reload
# pip install uvicorn[standard]

5. Ruia

一個基于asyncio和aiohttp的異步爬蟲框架,目標在于讓開發(fā)者編寫爬蟲盡可能地方便快速。國人開發(fā)中文文檔的支持,方便快速的構(gòu)建爬蟲項目,自定義HTML解析工具,快速獲取頁面數(shù)據(jù)。

官方demo:

import asyncio

from ruia import Item, TextField, AttrField


class HackerNewsItem(Item):
    target_item = TextField(css_select='tr.athing')
    title = TextField(css_select='a.storylink')
    url = AttrField(css_select='a.storylink', attr='href')


async def test_item():
    url = 'https://news.ycombinator.com/news?p=1'
    async for item in HackerNewsItem.get_items(url=url):
        print('{}: {}'.format(item.title, item.url))


if __name__ == '__main__':
    # Python 3.7 Required.
    asyncio.run(test_item()) 

    # For Python 3.6
    # loop = asyncio.get_event_loop()
    # loop.run_until_complete(test_item())

總結(jié)

隨著 python 社區(qū)對異步支持的愈發(fā)友好,異步框架的生態(tài)也愈發(fā)完善。Tornado 是我第一個接觸到的一步框架,現(xiàn)如今伴隨著最快 python web 框架之爭,Tornado也漸漸跌落神壇。但是至于誰是最快的并不重要,重要的是生態(tài),避免重復(fù)造輪子才是重要的。

PS:

  1. 我記得之前了解 Sanic 的時候它還是基于 aiohttp 開發(fā)的 web 框架,現(xiàn)如今已經(jīng)重構(gòu)了大部分代碼,核心組件也都自己實現(xiàn)。
  2. tornado 雖然語法過時了,但是應(yīng)該是最成熟、最早以及文檔最多的一個異步框架。
  3. 之前用tornado的時候還需要造關(guān)于異步操作的輪子,現(xiàn)如今生態(tài)日趨完善。

最后如果你想使用異步的框架,那么記得所有的IO操作均需要異步操作實現(xiàn),否則會大大影響性能。 (比如第三方的短信服務(wù)不能直接使用同步代碼的sdk )

參考資料

Aiohttp docs

Sanic 中文

Uvloop

Tornado 中文

以上就是python 常用的異步框架匯總整理的詳細內(nèi)容,更多關(guān)于python異步框架匯總的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于不懂Chromedriver如何配置環(huán)境變量問題解決方法

    關(guān)于不懂Chromedriver如何配置環(huán)境變量問題解決方法

    這篇文章主要介紹了關(guān)于不懂Chromedriver如何配置環(huán)境變量問題解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06
  • Numpy中array數(shù)組對象的儲存方式(n,1)和(n,)的區(qū)別

    Numpy中array數(shù)組對象的儲存方式(n,1)和(n,)的區(qū)別

    本文主要介紹了Numpy中array數(shù)組對象的儲存方式(n,1)和(n,)的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • pandas分組聚合(agg,transform,apply)

    pandas分組聚合(agg,transform,apply)

    在SQL中我們經(jīng)常使用 GROUP BY 將某個字段,按不同的取值進行分組, 在pandas中也有g(shù)roupby函數(shù),本文主要介紹了pandas分組聚合(agg,transform,apply),具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Python中dumps與dump及l(fā)oads與load的區(qū)別

    Python中dumps與dump及l(fā)oads與load的區(qū)別

    這篇文章主要介紹了Python中dumps與dump、loads與load的區(qū)別,json模塊提供了一種很簡單的方式來編碼和解碼JSON數(shù)據(jù)。其中兩個主要的函數(shù)是json.dumps()和json.loads(),需要的朋友可以參考下
    2022-04-04
  • WxPython中控件隱藏與顯示的小技巧

    WxPython中控件隱藏與顯示的小技巧

    這篇文章主要介紹了WxPython中控件隱藏與顯示的小技巧,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 讓python json encode datetime類型

    讓python json encode datetime類型

    python2.6+ 自帶的json模塊,不支持datetime的json encode,每次都需要手動轉(zhuǎn)為字符串,很累人,我們可以自己封裝一個簡單的方法處理此問題。
    2010-12-12
  • 14道基礎(chǔ)Python練習(xí)題(附答案)

    14道基礎(chǔ)Python練習(xí)題(附答案)

    這篇文章主要給大家分享的是14道基礎(chǔ)的Python練習(xí)題,我們都知道,無論是學(xué)習(xí)什么語言,剛開始的時候都缺不了練習(xí)的,下面小編講給大家分享14個python的基礎(chǔ)小練習(xí),需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11
  • 詳解python中executemany和序列的使用方法

    詳解python中executemany和序列的使用方法

    這篇文章主要介紹了詳解python中executemany和序列的使用方法的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • 幫你快速上手Jenkins并實現(xiàn)自動化部署

    幫你快速上手Jenkins并實現(xiàn)自動化部署

    在未學(xué)習(xí)Jenkins之前,只是對Jenkins有一個比較模糊的理解,即Jenkins是一個自動化構(gòu)建項目發(fā)布的工具,可以實現(xiàn)代碼->github或者gitlab庫->jenkins自動部署->訪問的整體的過程,而無需人為重新打包,今天就帶大家詳細了解一下,幫你快速上手Jenkins,需要的朋友可以參考下
    2021-06-06
  • python日志模塊logging案例詳解

    python日志模塊logging案例詳解

    日志模塊主要用于輸出運行日志,可以設(shè)置輸出日志的等級、日志保存路徑、日志文件回滾等,這篇文章主要介紹了python日志模塊logging,需要的朋友可以參考下
    2024-01-01

最新評論

浦城县| 富顺县| 栾川县| 民勤县| 秀山| 台北市| 神池县| 华坪县| 溆浦县| 尚志市| 治县。| 定襄县| 赤壁市| 天全县| 襄垣县| 彰化市| 安丘市| 阿克陶县| 丹东市| 桂平市| 滨州市| 朔州市| 松溪县| 嘉兴市| 鱼台县| 奉节县| 上思县| 常德市| 洛阳市| 江阴市| 宝山区| 郎溪县| 凤翔县| 资阳市| 吴江市| 彭阳县| 奇台县| 仪征市| 丁青县| 河北省| 汉源县|