gpt4 book ai didi

python - 当客户端断开连接时,如何在 django 中停止 StreamingHttpResponse?

转载 作者:太空狗 更新时间:2023-10-30 01:36:04 30 4
gpt4 key购买 nike

我的 django 服务器以 jpeg 流的形式提供视频源,一次一帧。

看起来像这样:

class VideoCamera():
def __init__(self):
# code

def get_frame(self):
# code
return frame

def gen(camera):
while True:
yield camera.get_frame()

def view_cam(request):
return StreamingHttpResponse(gen(VideoCamera()), content_type="multipart/x-mixed-replace;boundary=frame")

这是一个实时摄像头,所以流没有尽头。我需要它在客户端断开连接时被中断,但到目前为止,我无法弄清楚如何检测客户端断开连接。

我错过了什么吗?

编辑:

为了消除与相机有关的任何东西,我这样做了:

def gen():
for i in range(1000):
time.sleep(1)
print(i)
yield i

def view_cam(request):
return StreamingHttpResponse(gen(), content_type="multipart/x-mixed-replace;boundary=frame")

并使用 curl -N http://localhost/my_app/view_cam/ 连接到我的 View 。它流式传输数字,当我使用 Ctrl+C 停止 curl 时,生成器只是无限期地运行,没有注意到客户端消失了。如果我再运行和停止 curl 几次,就会有多个 gen() 函数实例在运行,这正是相机发生的情况。

编辑 2:

这个项目使用 Django Channels。我只是注意到,如果我通过在我的 settings.py 中注释掉它来禁用 channel ,上面的例子就可以完美地工作。我不认为 channel 与问题有关,但显然,它是 - 不知何故。

channel 开发服务器确实在 10 秒后检测到断开连接(不像默认的 django 服务器那样立即检测到),并显示如下:

Application instance call() running at /home/pi/paperless_clipboard/venv3/lib/python3.5/site-packages/channels/http.py:213> wait_for=._call_check_cancel() at /usr/lib/python3.5/asyncio/futures.py:452, Task._wakeup()]>> for connection took too long to shut down and was killed.

但是尽管有消息称某些东西已被杀死,gen() 仍在运行,并向终端打印数字。

最佳答案

你不能根据文档:

Performance considerations Django is designed for short-lived requests. Streaming responses will tie a worker process for the entire duration of the response. This may result in poor performance.

Generally speaking, you should perform expensive tasks outside of the request-response cycle, rather than resorting to a streamed response.

https://docs.djangoproject.com/en/2.1/ref/request-response/#streaminghttpresponse-objects

关于python - 当客户端断开连接时,如何在 django 中停止 StreamingHttpResponse?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54776224/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com