处理对 Django Web 应用程序的计算密集型请求,可能使用预分叉 RPC 服务器

Posted

技术标签:

【中文标题】处理对 Django Web 应用程序的计算密集型请求,可能使用预分叉 RPC 服务器【英文标题】:Handle computationally-intensive requests to a Django web application, possibly using a pre-forking RPC server 【发布时间】:2012-08-16 14:14:29 【问题描述】:

我正在运行一个基于 Django 的网络服务,在 nginx 后面使用 Gunicorn 作为反向代理。

我的网络服务提供了一个 Django 视图,该视图使用 MATLAB 的外部实例执行计算。由于 MATLAB 启动本身需要几秒钟的时间,因此即使是只产生非常简单的 MATLAB 计算的请求也需要这么长的时间才能得到响应。

此外,由于在我的代码中完成了 MATLAB 沙盒,因此对于网络服务器进程,同时运行一个 MATLAB 实例非常重要。 (因此,目前我正在使用 Gunicorn 同步工作者模型,它实现了预分叉网络服务器,但不使用任何多线程。)

为了改善用户体验,我现在想通过保持一些(例如 3-5 个)“就绪”的 MATLAB 实例运行并在请求进入时使用它们来消除 MATLAB 启动的等待时间。处理请求后, MATLAB 进程将被终止,并立即启动一个新进程,为下一个请求做好准备。

我一直在评估两种方法来做到这一点:

    继续使用 Gunicorn 同步工作器模型并为每个网络服务器进程保留一个 MATLAB 实例。

    这个问题似乎是传入的请求没有以循环方式分发到网络服务器工作进程。因此,可能会发生所有计算密集型请求都命中同一个进程,而用户仍然需要等待,因为单个 MATLAB 实例无法按需要尽快重新启动。

    将 MATLAB 计算外包给后端服务器,后端服务器执行实际工作并由网络服务器进程通过 RPC 进行查询。

    在我的概念中,会有许多 RPC 服务器进程在运行,每个进程都托管一个正在运行的 MATLAB 进程。处理请求后,将重新启动 MATLAB 进程。因为 RPC 服务器进程是循环查询的,所以用户永远不必等待 MATLAB 启动(除非总体请求太多,但这是不可避免的)。

由于第一种方法描述的问题,我认为 RPC 服务器(方法 2)会更好地解决我的问题。

我已经查看了一些 Python 的 RPC 解决方案(尤其是 Pyro 和 RPyC),但是我找不到为 RPC 服务器使用预分叉服务器模型的实现。请记住,由于沙箱,多线程是不可能的,如果服务器只在连接被接受后分叉,我仍然需要在这之后启动 MATLAB,这会阻碍整个想法。

有人知道我的问题的更好解决方案吗?还是 RPC 服务器实际上是最好的解决方案?但是然后我需要一个预分叉 RPC 服务器(= 分叉一些进程并让它们都在同一个套接字上的 accept() 上旋转)或至少一个可以轻松修改的 RPC 框架(猴子补丁?) -分叉。

提前致谢。

【问题讨论】:

【参考方案1】:

我通过使我的沙盒线程安全解决了这个问题。现在我可以使用任何单进程网络服务器并使用Queue 来获取在辅助线程中生成的备用 MATLAB 实例。

【讨论】:

以上是关于处理对 Django Web 应用程序的计算密集型请求,可能使用预分叉 RPC 服务器的主要内容,如果未能解决你的问题,请参考以下文章

初识Flask

Flask基础

G-Hadoop: MapReduce用于跨分布式数据中心数据密集型计算

进程和线程

Gearman 异步任务软件的介绍

web性能测试要注意的事