我正在运行一个基于 Django 的 web 服务,在 nginx 后面使用 Gunicorn 作为反向代理。
我的网络服务提供了一个 Django 视图,该视图使用 MATLAB 的外部实例执行计算。因为 MATLAB 启动本身需要几秒钟的时间,所以即使是只产生非常简单的 MATLAB 计算的请求也需要这么长的时间来回答。
此外,由于在我的代码中完成了 MATLAB 沙盒,因此对于 Web 服务器进程,同时运行一个 MATLAB 实例非常重要。(因此,目前我正在使用 Gunicorn 同步工作者模型,它实现了预分叉网络服务器,但不使用任何多线程。)
为了改善用户体验,我现在想通过保持一些(例如 3-5 个)“就绪”的 MATLAB 实例运行并在请求进入时使用它们来消除 MATLAB 启动的等待时间。在为请求提供服务后,MATLAB 进程将被终止并立即启动一个新的,为另一个请求做好准备。
我一直在评估两种方法来做到这一点:
继续使用 Gunicorn 同步工作器模型并为每个 Web 服务器进程保留一个 MATLAB 实例。
这个问题似乎是传入的请求没有以循环方式分发到网络服务器工作进程。因此,可能会发生所有计算密集型请求都命中同一进程而用户仍需等待的情况,因为该单个 MATLAB 实例无法按需要尽快重新启动。
将 MATLAB 计算外包给后端服务器,后端服务器执行实际工作并由网络服务器进程通过 RPC 进行查询。
在我的概念中,会有许多 RPC 服务器进程在运行,每个进程都托管一个正在运行的 MATLAB 进程。处理请求后,将重新启动 MATLAB 进程。因为 RPC 服务器进程是循环查询的,所以用户永远不必等待 MATLAB 启动(除非总体请求太多,但这是不可避免的)。
由于第一种方法描述的问题,我认为 RPC 服务器(方法 2)会更好地解决我的问题。
我已经看过一些 Python 的 RPC 解决方案(尤其是 Pyro 和 RPyC),但是我找不到为 RPC 服务器使用预分叉服务器模型的实现。请记住,由于沙箱,多线程是不可能的,如果服务器只在连接被接受后分叉,我仍然需要在这之后启动 MATLAB,这会阻碍整个想法。
有人知道我的问题的更好解决方案吗?还是 RPC 服务器实际上是最好的解决方案?但是然后我需要一个预分叉 RPC 服务器(= 分叉一些进程并让它们都在同一个套接字上的 accept() 上旋转)或至少一个可以轻松修改的 RPC 框架(猴子补丁?) -分叉。
提前致谢。