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

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

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接