首页 > 解决方案 > 将 udp m2tp 单播流代理到流式 sanic.response 时 CPU 使用率差异很大

问题描述

我开发了一个代理,它可以让我使用我的 ISP 提供的追赶视频作为通过 http 的 udp 单播 m2tp 流。为此,我使用 python、asyncio 和 Sanic。

它工作得很好,但有些事情我无法解释。一些流使用不到 8% 的一个 cpu 核心 (i7-3770),而其他特定流则消耗多达 30%。所有的流原则上都是相同的,我不对它们做任何处理,只是从 udp 套接字读取并写入流sanic.Response,基本上是这样的:

import asyncio_dgram
import socket

from contextlib import closing
from Sanic import Sanic, response

app = Sanic()

MIME = 'video/MP2T'

@app.get('/some/url')
async def handle_url(request):
    host = socket.gethostbyname(socket.gethostname())
    client_port = 43545
    async def my_streaming_fn(response):
        with closing(await asyncio_dgram.bind((host, client_port))) as stream:
            while True:
                data, remote_addr = await stream.recv()
                await response.write(data)

    return response.stream(my_streaming_fn, content_type=MIME)

所有流都到达一个单独的 vlan,所有 ts 数据包都是 1344 字节(1316 没有标头)。即使来自相同的原始电视频道,我也看到了相同比特率的流的差异。

我缺少什么可以解释某些流和其他流之间 cpu 使用率的巨大差异?任何想法?

标签: pythonudpstreamingpython-asynciosanic

解决方案


推荐阅读