在 Django/Gunicorn 应用程序中拥有持久(非执事)线程的危险



我通常不需要在我的 Django 应用程序级编程(即视图)中显式使用线程。 但是我注意到一个看起来很有趣的库,它通过线程处理服务器端分析。

在 Django 视图中,您将使用他们的 Python 客户端在单独的(非守护进程)线程中将 HTTP POST 批处理到他们的 Web 服务。通常,我会使用 RabbitMQ 来做这样的事情,而不是线程,但他们希望降低库的启动成本。

我的问题是,这种方法有什么缺点吗?线程有一些额外的内存占用,但我并不太担心。 这显然取决于启动的请求/线程的数量。

线程不是守护程序并且可能长时间运行的事实是一个问题吗? 我假设 Gunicorn 进程是执行的主线程,它在无限循环中运行,因此它是否必须等待非守护进程线程退出通常无关紧要。 这是对的吗?

这是一个悬而未决的问题,但重点是理解 Django/Gunicorn 应用程序中非守护进程线程的影响。

Gunicorn 使用预分叉工作线程模型。 主进程生成并管理工作进程。 对于非龙卷风用途,有两种类型的工作线程:同步(默认)和异步。

在正常操作中,

这些工作线程在一个循环中运行,直到主服务器告诉它们正常关闭或杀死它们。 工人会定期向师傅发出心跳,表明他们还活着并且还在工作。 如果发生检测信号超时,则主服务器将终止工作线程并重新启动它。

因此,不干扰 worker 主循环的守护程序和非守护程序线程应该没有影响。 如果线程确实干扰了工作线程的主循环,例如线程正在执行工作并将向 HTTP 响应提供结果的情况,请考虑使用异步工作线程。 异步工作线程允许 TCP 连接长时间保持活动状态,同时仍允许工作线程向主节点发出检测信号。

最新更新