国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

(aiohttp-asyncio-FFmpeg-Docker-SRS)實(shí)現(xiàn)異步攝像頭轉(zhuǎn)碼服務(wù)器

這篇具有很好參考價(jià)值的文章主要介紹了(aiohttp-asyncio-FFmpeg-Docker-SRS)實(shí)現(xiàn)異步攝像頭轉(zhuǎn)碼服務(wù)器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 背景介紹

在先前的博客文章中,我們已經(jīng)搭建了一個(gè)基于SRS的流媒體服務(wù)器?,F(xiàn)在,我們希望通過Web接口來控制這個(gè)服務(wù)器的行為,特別是對(duì)于正在進(jìn)行的 RTSP 轉(zhuǎn)碼任務(wù)的管理。這將使我們能夠在不停止整個(gè)服務(wù)器的情況下,動(dòng)態(tài)地啟動(dòng)或停止攝像頭的轉(zhuǎn)碼過程。

Docker部署 SRS rtmp/flv流媒體服務(wù)器-CSDN博客文章瀏覽閱讀360次,點(diǎn)贊7次,收藏5次。SRS(Simple Realtime Server)是一款開源的流媒體服務(wù)器,具有高性能、高可靠性、高靈活性的特點(diǎn),能夠支持直播、點(diǎn)播、轉(zhuǎn)碼等多種流媒體應(yīng)用場(chǎng)景。SRS 不僅提供了流媒體服務(wù)器,還提供了適用于多種平臺(tái)的客戶端 SDK 和在線轉(zhuǎn)碼等輔助服務(wù),是一款十分強(qiáng)大的流媒體解決方案。https://blog.csdn.net/m0_56659620/article/details/135400510?spm=1001.2014.3001.5501

2. 技術(shù)選擇

在選擇技術(shù)方案時(shí),考慮到構(gòu)建視頻流轉(zhuǎn)碼服務(wù)的需求,我們將采用Python編程語言,并結(jié)合asyncio和aiohttp庫。這一選擇基于異步框架的優(yōu)勢(shì),以下是對(duì)異步框架和同步框架在視頻流轉(zhuǎn)碼場(chǎng)景中的優(yōu)缺點(diǎn)的明確總結(jié):

異步框架的優(yōu)勢(shì):

  • 高并發(fā)處理: 異步框架通過非阻塞方式處理請(qǐng)求,能夠高效處理大量并發(fā)請(qǐng)求,確保系統(tǒng)在高負(fù)載下保持穩(wěn)定性。
  • 異步I/O: 支持異步I/O操作,允許在等待I/O操作完成的同時(shí)繼續(xù)處理其他請(qǐng)求,提高整體效率。
  • 資源利用率高: 能夠更有效地利用系統(tǒng)資源,同時(shí)處理多個(gè)請(qǐng)求,提高視頻轉(zhuǎn)碼效率。
  • 事件驅(qū)動(dòng): 采用事件驅(qū)動(dòng)模型,適應(yīng)實(shí)時(shí)性要求高的視頻流處理,能夠立即響應(yīng)新的轉(zhuǎn)碼請(qǐng)求。

同步框架的缺點(diǎn):

  • 阻塞: 阻塞調(diào)用可能導(dǎo)致整個(gè)程序停滯,尤其在處理大文件或網(wǎng)絡(luò)請(qǐng)求時(shí)可能引發(fā)性能問題,特別是在高并發(fā)場(chǎng)景下。
  • 低并發(fā): 每個(gè)請(qǐng)求需要獨(dú)立的線程或進(jìn)程,可能導(dǎo)致系統(tǒng)資源耗盡,降低并發(fā)處理能力,對(duì)于需要同時(shí)處理多個(gè)視頻流的情況可能不夠高效。

考慮到處理大量并發(fā)請(qǐng)求、提高系統(tǒng)性能和響應(yīng)性的需求,采用異步框架是更為合適的選擇。異步框架的高并發(fā)處理能力、異步I/O支持、高資源利用率以及事件驅(qū)動(dòng)的特性使其更適用于實(shí)時(shí)性要求較高的視頻流轉(zhuǎn)碼服務(wù)。

3. 代碼實(shí)現(xiàn)(必須在linux系統(tǒng)運(yùn)行,4步驟為部署攻略)

3.1 導(dǎo)入必要的庫

首先,我們導(dǎo)入所需的庫,包括asyncio、aiohttp、aiohttp_cors和logging。

import asyncio
from aiohttp import web
import aiohttp_cors
import logging

3.2 設(shè)置日志

logging.basicConfig(level=logging.INFO)

3.3 配置并發(fā)控制和任務(wù)跟蹤

設(shè)置最大同時(shí)運(yùn)行的ffmpeg子進(jìn)程數(shù)量,并使用Semaphore限制并發(fā)進(jìn)程數(shù)量。同時(shí),使用字典跟蹤正在進(jìn)行的轉(zhuǎn)碼任務(wù)。

MAX_CONCURRENT_PROCESSES = 5
semaphore = asyncio.Semaphore(MAX_CONCURRENT_PROCESSES)
transcoding_tasks = {}

3.4 定義啟動(dòng)和停止轉(zhuǎn)碼任務(wù)的方法

定義啟動(dòng)和停止 RTSP 轉(zhuǎn)碼任務(wù)的方法

# 開始轉(zhuǎn)碼方法
async def perform_transcoding(ip, camera_id, rtmp_server):
    # 檢查相同RTSP是否已有子進(jìn)程在處理
    if camera_id in transcoding_tasks:
        return transcoding_tasks[camera_id]

    # 使用Semaphore限制并發(fā)進(jìn)程數(shù)量
    async with semaphore:
        # 實(shí)際的轉(zhuǎn)碼操作,這里需要調(diào)用ffmpeg或其他工具
        ffmpeg_command = [
            'ffmpeg',
            '-rtsp_transport', 'tcp',
            '-i', ip,
            '-c:v', 'libx264',
            '-c:a', 'aac',
            '-f', 'flv',
            f'{rtmp_server}/live/livestream{camera_id}'
        ]

        # 創(chuàng)建異步子進(jìn)程
        process = await asyncio.create_subprocess_exec(*ffmpeg_command)

        # 將任務(wù)添加到字典中
        transcoding_tasks[camera_id] = process

        # 等待子進(jìn)程完成
        await process.communicate()

        # 從字典中移除已完成的任務(wù)
        transcoding_tasks.pop(camera_id, None)

# 停止轉(zhuǎn)碼方法
async def stop_transcoding(camera_id):
    # 停止轉(zhuǎn)碼任務(wù)
    if camera_id in transcoding_tasks:
        process = transcoding_tasks[camera_id]
        process.terminate()  # 發(fā)送終止信號(hào)
        await process.wait()  # 等待進(jìn)程結(jié)束

        # 從字典中移除已停止的任務(wù)
        transcoding_tasks.pop(camera_id, None)

3.5 定義Web接口路由

定義Web接口路由,包括啟動(dòng)攝像頭轉(zhuǎn)碼、停止攝像頭轉(zhuǎn)碼和停止所有攝像頭轉(zhuǎn)碼的路由。

# 開始轉(zhuǎn)碼任務(wù)
async def play_camera(request):
    data = await request.post()

    # 從表單數(shù)據(jù)中獲取攝像頭的ID和rtsp流
    camera_id = data.get('id')
    rtsp = data.get('ip')

    # 這里設(shè)置你的 RTMP 服務(wù)器地址
    rtmp_server = 'rtmp://192.168.14.93:1935'

    # 執(zhí)行實(shí)際的轉(zhuǎn)碼操作
    task = await perform_transcoding(rtsp, camera_id, rtmp_server)

    # 返回包含轉(zhuǎn)碼后的RTMP URL的JSON響應(yīng)
    rtmp_url = f'http://192.168.14.93:8080/live/livestream{camera_id}.flv'
    return web.json_response({'message': '轉(zhuǎn)碼啟動(dòng)成功', 'flv_data': rtmp_url})


# 停止轉(zhuǎn)碼任務(wù)
async def stop_camera(request):
    data = await request.post()
    camera_id = data.get('id')

    # 停止指定攝像頭的轉(zhuǎn)碼任務(wù)
    await stop_transcoding(camera_id)

    return web.json_response({'code':200,'message': '轉(zhuǎn)碼停止成功'})


# 如果頁面進(jìn)行刷新或者關(guān)閉停止全部轉(zhuǎn)碼任務(wù)
async def stop_all_camera(request):

    # 獲取所有正在運(yùn)行的任務(wù)的列表
    tasks = [stop_transcoding(camera_id) for camera_id in transcoding_tasks.keys()]

    # 并發(fā)停止所有任務(wù)
    await asyncio.gather(*tasks)

    # 清空字典,表示所有任務(wù)都已停止
    transcoding_tasks.clear()

    return web.json_response({'code':200,'message': '轉(zhuǎn)碼停止成功'})

3.6 創(chuàng)建Web應(yīng)用和配置CORS

創(chuàng)建Web應(yīng)用,配置CORS(跨域資源共享)中間件,以確保接口可以被跨域訪問。

app = web.Application()

# CORS配置
cors = aiohttp_cors.setup(app, defaults={
    "*": aiohttp_cors.ResourceOptions(
        allow_credentials=True,
        expose_headers="*",
        allow_headers="*",
    )
})

3.7 添加Web接口路由

添加Web接口路由,包括啟動(dòng)攝像頭轉(zhuǎn)碼、停止攝像頭轉(zhuǎn)碼和停止所有攝像頭轉(zhuǎn)碼的路由。

app.router.add_route('POST', '/play_camera', play_camera)  # 開始轉(zhuǎn)碼任務(wù)路由
app.router.add_route('POST', '/stop_camera', stop_camera)  # 停止轉(zhuǎn)碼任務(wù)路由
app.router.add_route('POST', '/stop_all_camera', stop_all_camera)  # 停止全部轉(zhuǎn)碼任務(wù)路由

3.8 添加CORS中間件

添加CORS中間件,確保接口可以被跨域訪問。

# 添加 CORS 中間件
for route in list(app.router.routes()):
    cors.add(route)

3.9 運(yùn)行Web應(yīng)用

運(yùn)行Web應(yīng)用,監(jiān)聽指定的主機(jī)和端口。

if __name__ == '__main__':
    web.run_app(app, host='0.0.0.0', port=7000,access_log=logging.getLogger())

?3.10 完整代碼

import asyncio
from aiohttp import web
import aiohttp_cors
import logging

# 設(shè)置日志級(jí)別
logging.basicConfig(level=logging.INFO)

# 最大同時(shí)運(yùn)行的ffmpeg子進(jìn)程數(shù)量
MAX_CONCURRENT_PROCESSES = 5

# 使用Semaphore限制并發(fā)進(jìn)程數(shù)量
semaphore = asyncio.Semaphore(MAX_CONCURRENT_PROCESSES)

# 字典用于跟蹤正在進(jìn)行的轉(zhuǎn)碼任務(wù)
transcoding_tasks = {}

# 開始轉(zhuǎn)碼方法
async def perform_transcoding(ip, camera_id, rtmp_server):
    # 檢查相同RTSP是否已有子進(jìn)程在處理
    if camera_id in transcoding_tasks:
        return transcoding_tasks[camera_id]

    # 使用Semaphore限制并發(fā)進(jìn)程數(shù)量
    async with semaphore:
        # 實(shí)際的轉(zhuǎn)碼操作,這里需要調(diào)用ffmpeg或其他工具
        ffmpeg_command = [
            'ffmpeg',
            '-rtsp_transport', 'tcp',
            '-i', ip,
            '-c:v', 'libx264',
            '-c:a', 'aac',
            '-f', 'flv',
            f'{rtmp_server}/live/livestream{camera_id}'
        ]

        # 創(chuàng)建異步子進(jìn)程
        process = await asyncio.create_subprocess_exec(*ffmpeg_command)

        # 將任務(wù)添加到字典中
        transcoding_tasks[camera_id] = process

        # 等待子進(jìn)程完成
        await process.communicate()

        # 從字典中移除已完成的任務(wù)
        transcoding_tasks.pop(camera_id, None)

# 停止轉(zhuǎn)碼方法
async def stop_transcoding(camera_id):
    # 停止轉(zhuǎn)碼任務(wù)
    if camera_id in transcoding_tasks:
        process = transcoding_tasks[camera_id]
        process.terminate()  # 發(fā)送終止信號(hào)
        await process.wait()  # 等待進(jìn)程結(jié)束

        # 從字典中移除已停止的任務(wù)
        transcoding_tasks.pop(camera_id, None)


# 開始轉(zhuǎn)碼任務(wù)
async def play_camera(request):
    data = await request.post()

    # 從表單數(shù)據(jù)中獲取攝像頭的ID和rtsp流
    camera_id = data.get('id')
    rtsp = data.get('ip')

    # 這里設(shè)置你的 RTMP 服務(wù)器地址
    rtmp_server = 'rtmp://192.168.14.93:1935'

    # 執(zhí)行實(shí)際的轉(zhuǎn)碼操作
    task = await perform_transcoding(rtsp, camera_id, rtmp_server)

    # 返回包含轉(zhuǎn)碼后的RTMP URL的JSON響應(yīng)
    rtmp_url = f'http://192.168.14.93:8080/live/livestream{camera_id}.flv'
    return web.json_response({'message': '轉(zhuǎn)碼啟動(dòng)成功', 'flv_data': rtmp_url})


# 停止轉(zhuǎn)碼任務(wù)
async def stop_camera(request):
    data = await request.post()
    camera_id = data.get('id')

    # 停止指定攝像頭的轉(zhuǎn)碼任務(wù)
    await stop_transcoding(camera_id)

    return web.json_response({'code':200,'message': '轉(zhuǎn)碼停止成功'})


# 如果頁面進(jìn)行刷新或者關(guān)閉停止全部轉(zhuǎn)碼任務(wù)
async def stop_all_camera(request):

    # 獲取所有正在運(yùn)行的任務(wù)的列表
    tasks = [stop_transcoding(camera_id) for camera_id in transcoding_tasks.keys()]

    # 并發(fā)停止所有任務(wù)
    await asyncio.gather(*tasks)

    # 清空字典,表示所有任務(wù)都已停止
    transcoding_tasks.clear()

    return web.json_response({'code':200,'message': '轉(zhuǎn)碼停止成功'})


app = web.Application()

# CORS配置
cors = aiohttp_cors.setup(app, defaults={
    "*": aiohttp_cors.ResourceOptions(
        allow_credentials=True,
        expose_headers="*",
        allow_headers="*",
    )
})

app.router.add_route('POST', '/play_camera', play_camera)  # 開始轉(zhuǎn)碼任務(wù)路由
app.router.add_route('POST', '/stop_camera', stop_camera)  # 停止轉(zhuǎn)碼任務(wù)路由
app.router.add_route('POST', '/stop_all_camera', stop_all_camera)  # 停止全部轉(zhuǎn)碼任務(wù)路由

# 添加 CORS 中間件
for route in list(app.router.routes()):
    cors.add(route)


if __name__ == '__main__':
    web.run_app(app, host='0.0.0.0', port=7000,access_log=logging.getLogger())

4. 部署(Docker環(huán)境)

部署所需Dockerfile文件代碼如下

FROM python:3.7-slim

WORKDIR /app

COPY requirements.txt .

RUN apt-get update \
    && apt-get install -y ffmpeg \
    && rm -rf /var/lib/apt/lists/* \
    && pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "async_io_io.py"]

部署所需requirements.txt如下

aiohttp
aiohttp-cors
ffmpeg

根目錄進(jìn)行打包及啟動(dòng)

(aiohttp-asyncio-FFmpeg-Docker-SRS)實(shí)現(xiàn)異步攝像頭轉(zhuǎn)碼服務(wù)器,服務(wù)器,運(yùn)維

請(qǐng)求接口實(shí)現(xiàn)轉(zhuǎn)碼

(aiohttp-asyncio-FFmpeg-Docker-SRS)實(shí)現(xiàn)異步攝像頭轉(zhuǎn)碼服務(wù)器,服務(wù)器,運(yùn)維

5. 總結(jié)

通過以上的步驟,我們成功構(gòu)建了一個(gè)流媒體服務(wù)器控制接口,可以通過Web接口實(shí)現(xiàn)對(duì)攝像頭的 RTSP 轉(zhuǎn)碼任務(wù)的動(dòng)態(tài)管理。這個(gè)接口可以集成到現(xiàn)有的流媒體服務(wù)器中,提供更多控制和管理的可能性。文章來源地址http://www.zghlxwxcb.cn/news/detail-781833.html

到了這里,關(guān)于(aiohttp-asyncio-FFmpeg-Docker-SRS)實(shí)現(xiàn)異步攝像頭轉(zhuǎn)碼服務(wù)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Windows-docker集成SRS服務(wù)器的部署和使用

    Windows-docker集成SRS服務(wù)器的部署和使用

    一、Windows Docker安裝 Docker Desktop 官方下載地址: https://docs.docker.com/desktop/install/windows-install/ 下載windows版本的就可以了。 注意:此方法僅適用于 Windows 10 操作系統(tǒng)專業(yè)版、企業(yè)版、教育版和部分家庭版! 安裝 Hyper-V 我們開啟Hyper-V。 我們安裝好Docker for Windows后,可以在CMD中執(zhí)

    2024年02月10日
    瀏覽(32)
  • SRS視頻媒體服務(wù)器-docker啟動(dòng):更換默認(rèn)端口時(shí)的錯(cuò)誤

    SRS視頻媒體服務(wù)器-docker啟動(dòng):更換默認(rèn)端口時(shí)的錯(cuò)誤

    在使用srs視頻服務(wù)器時(shí),一直都是使用默認(rèn)的端口配置。但是,這些默認(rèn)端口在某些時(shí)候可能已經(jīng)被占用了,就需要更改端口了。 注意注意注意:使用docker啟動(dòng)srs,在更換端口一定要下面的內(nèi)容。 網(wǎng)絡(luò)拓?fù)鋱D: ? 啟動(dòng)命令:外部端口1936映射內(nèi)部1935? 和 外部端口8001映射內(nèi)部

    2024年02月13日
    瀏覽(17)
  • docker部署SRS實(shí)時(shí)視頻服務(wù)器,rtmp推流,用WebRTC播放

    docker部署SRS實(shí)時(shí)視頻服務(wù)器,rtmp推流,用WebRTC播放

    SRS是一個(gè)簡單高效的實(shí)時(shí)視頻服務(wù)器,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181 大家可以先去gitub上面看使用說明,地址是:v4_CN_Home · ossrs/srs Wiki · GitHub 然后我們通過docker去啟動(dòng)SRS,這些文檔里面都有,就不用多說了,然后我們可以用rtmp推流 用WebRTC播放,首先要支持WebRTC我們需要

    2023年04月11日
    瀏覽(32)
  • 9步實(shí)現(xiàn) Docker部署 SRS rtmp/flv流媒體服務(wù)器

    9步實(shí)現(xiàn) Docker部署 SRS rtmp/flv流媒體服務(wù)器

    這是基于centos7.6系統(tǒng)部署的 運(yùn)行容器會(huì)直接停留在容器運(yùn)行界面,通過Ctrl+P+Q可后臺(tái)形式退出容器 這時(shí)候其實(shí)已經(jīng)運(yùn)行成功!可以通過以下命令查看SRS控制臺(tái) 進(jìn)入/home/docker/srs3 可查看配置文件是否復(fù)制成功 這是可能會(huì)報(bào)錯(cuò): 因?yàn)椴襟E四我們意見運(yùn)行一個(gè)容器,已經(jīng)使用過

    2024年02月15日
    瀏覽(23)
  • 在服務(wù)器上使用Docker運(yùn)行SRS Stack,推拉直播流、多平臺(tái)轉(zhuǎn)播、本地錄制、虛擬直播、直播轉(zhuǎn)碼、AI字幕、其他

    在服務(wù)器上使用Docker運(yùn)行SRS Stack,推拉直播流、多平臺(tái)轉(zhuǎn)播、本地錄制、虛擬直播、直播轉(zhuǎn)碼、AI字幕、其他

    SRS Stack | SRS (ossrs.net) Docker? 推薦使用Docker運(yùn)行SRS Stack: 服務(wù)器防火墻開啟端口:? TCP/1935 復(fù)制 請(qǐng)打開頁面http://localhost:2022開始使用SRS Stack。 關(guān)于使用說明,請(qǐng)參考?SRS Stack Docker。

    2024年01月16日
    瀏覽(25)
  • Python異步編程探究:深入理解asyncio的使用和原理【第130篇—asyncio】

    Python異步編程探究:深入理解asyncio的使用和原理【第130篇—asyncio】

    前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。【點(diǎn)擊進(jìn)入巨牛的人工智能學(xué)習(xí)網(wǎng)站】。 隨著計(jì)算機(jī)應(yīng)用程序的復(fù)雜性不斷增加,對(duì)于高效處理I/O密集型任務(wù)的需求也越來越迫切。在Python中,asyncio模塊提供了一種強(qiáng)大的異步編程

    2024年04月12日
    瀏覽(31)
  • 高并發(fā) 發(fā)送請(qǐng)求(asyncio)

    高并發(fā) 發(fā)送請(qǐng)求(asyncio)

    在接手這個(gè)項(xiàng)目之前,關(guān)于數(shù)據(jù)存儲(chǔ)的代碼邏輯如上圖,看起來按部就班,也很合理。(本人覺得這就像個(gè)玩具車) 在最后一步發(fā)送HTTP request響應(yīng)足夠快的話,其實(shí)速度說不上快但穩(wěn)定,可以接受。但偏偏第三季度了,數(shù)據(jù)量上來了,最后一步得到response的時(shí)間達(dá)到了2秒多(

    2024年02月07日
    瀏覽(21)
  • Asyncio 協(xié)程異步筆記

    協(xié)程不是計(jì)算機(jī)提供,而是程序員人為創(chuàng)造。 協(xié)程(coroutine),也可以被稱為微線程,是一種用戶態(tài)內(nèi)的上下文切換技術(shù)。簡而言之,其實(shí)就是通過一個(gè)線程實(shí)現(xiàn)代碼塊互相切換運(yùn)行。例如: 實(shí)現(xiàn)協(xié)程有這么幾種方法: greenlet ,早期模塊。 yield 。 asyncio 裝飾器(py

    2024年02月08日
    瀏覽(18)
  • aiohttp 異步爬蟲實(shí)戰(zhàn)

    之前介紹的 asyncio 模塊內(nèi)部 實(shí)現(xiàn)了對(duì) TCP、UDP、SSL 協(xié)議的異步操作,但是對(duì)于 HTTP 請(qǐng)求的異步操作來說,我們就需要用到 aiohttp 來實(shí)現(xiàn)了 。aiohttp 是 一個(gè)基于 asyncio 的異步 HTTP 網(wǎng)絡(luò)模塊,它既提供了服務(wù)端,又提供了客戶端 。其中我們用服務(wù)端可以搭建一個(gè)支持異步處理的

    2023年04月22日
    瀏覽(17)
  • Sanic、uvloop及Asyncio的局限

    Sanic、uvloop及Asyncio的局限

    sanic使用基于libuv的uvloop事件循環(huán)替代python asnycio自帶的事件循環(huán)替代,以此提高異步性能。 Flask和Django是同步框架,Tornado、FastApi和Sanic均為異步框架,Sanic的性能最好。 Sanic入門教程:Sanic:一款號(hào)稱 Python 中性能最高的異步 web 框架,全方位介紹 Sanic Sanic支持通過workers設(shè)置并

    2024年02月12日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包