2012-08-16 15 views
3

我正在運行一個基於Django的web服務,Gunicorn作爲nginx作爲反向代理。將計算密集型請求處理到Django Web應用程序,可能使用預分配RPC服務器

我的web服務提供了一個Django視圖,它使用MATLAB的外部實例執行計算。由於MATLAB的啓動需要幾秒鐘的時間,即使只需要非常簡單的MATLAB計算的請求也需要這段時間才能得到回答。此外,由於在我的代碼中完成了MATLAB沙箱,因此在Web服務器進程中同時運行一個MATLAB實例是非常重要的。 (因此,目前我正在使用Gunicorn同步工作人員模型,該模型實現了預分派web服務器,但未使用任何多線程。)

爲了改善用戶體驗,我現在想要消除MATLAB啓動的等待時間通過保留一些(例如3-5個)「準備就緒」的MATLAB實例運行,並在請求進入時使用它們。請求服務完成後,MATLAB進程將被終止,並立即啓動一個新進程,以便爲另一個請求。

我一直evaluationg兩種方法可以做到這一點:

  1. 繼續使用Gunicorn同步工人模型,並保持每個網絡服務器過程中的一個MATLAB實例。

    與此問題似乎是傳入的請求沒有以循環方式分發到Web服務器工作進程。因此,所有計算密集型的請求都會碰到同一個進程,用戶仍然需要等待,因爲這個MATLAB實例無法按需要重新啓動。

  2. 將MATLAB計算外包給後端服務器,後端服務器執行實際工作並通過RPC通過Web服務器進程進行查詢。

    在我的概念中,將會有許多RPC服務器進程在運行,每個運行一個正在運行的MATLAB進程。請求處理完畢後,MATLAB進程將重新啓動。由於RPC服務器進程是循環查詢的,因此用戶不必等待MATLAB啓動(除非總體請求太多,但這是不可避免的)。

由於第一種方法描述的問題,我認爲RPC服務器(方法2)將是我的問題的更好的解決方案。

我已經看過一些針對Python的RPC解決方案(尤其是Pyro和RPyC),但是我找不到一個爲RPC服務器使用預分叉服務器模型的實現。請記住,由於沙箱,多線程是不可能的,如果服務器只在連接被接受後才分叉,那麼我仍然需要啓動MATLAB來阻止整個想法。

有沒有人知道我的問題更好的解決方案?或者RPC服務器實際上是最好的解決方案?但是之後我需要一個預分叉的RPC服務器(=分支一些進程並讓它們在同一個套接字上旋轉accept()),或者至少一個可以容易修改(猴子修補?)的RPC框架-forking。

在此先感謝。

回答

0

我已經通過使我的沙箱線程安全來解決問題。現在我可以使用任何單進程的Web服務器,並使用Queue來獲得在輔助線程中產生的備用MATLAB實例。

相關問題