2012-01-01 56 views
4

我正在研究與基因組搜索相關的Web應用程序。此應用程序通過Cython綁定使用此suffix tree library。這種類型的對象很大(數百MB到10GB),並且需要花費很長時間從磁盤加載,以響應頁面請求處理它們。我正在尋找一種在服務器啓動時加載這些對象的方法,然後將它們用於所有頁面請求。Web應用程序:在請求之間保持大對象

我試過使用遠程管理器/客戶端設置使用多處理模塊,建模在this demo之後,但是當客戶端連接時顯示對象不可選的錯誤消息時,它失敗。

+1

這很大程度上取決於您使用的是哪個HTTP服務器以及您使用的是什麼框架......您能告訴我們嗎? – 2012-01-01 22:49:25

+0

頁面請求目前由LAMP上的Drupal處理,其作業是爲了響應表單提交而創建的。目前沒有持續運行的python進程。儘管如此,我願意改變這一點。 – njbooher 2012-01-01 22:57:15

+0

等等...所以如果你的請求是由Drupal處理的,那麼Python是從哪裏來的?你想讓Drupal應用程序與Python服務器建立連接來完成處理嗎? – 2012-01-01 23:23:07

回答

6

我會建議編寫一個小的Flask(甚至是原始的WSGI ......但使用Flask可能更簡單,因爲它會更容易快速啓動並運行)加載基因組數據的應用程序然後公開一個簡單的API。就像這樣:

app = Flask(__name__) 
database = load_database() 

@app.route('/get_genomes') 
def get_genomes(): 
    return database.all_genomes() 

app.run(debug=True) 

或者,你知道,更明智一點。

另外,如果你需要在一個時間內處理多個請求(我相信app.run將只處理一次一個),由線程開始... ...如果這太慢了,你可以os.fork()後數據庫被加載並從那裏運行多個請求處理程序(這樣它們將全部在內存中共享相同的數據庫)。

+0

對不起,我現在試圖將它與任務隊列配對並遇到問題。 https://gist.github.com/2b94198bc0b8ec631186 這將不起作用,因爲Pyres無法處理在作業排入隊列時在同一個文件中定義的作業類,但是如果我將作業類移動到不同的作業類模塊我不知道如何從主文件中訪問全局變量。使用靜態執行方法似乎是一個要求,傳遞給它的參數需要是可序列化的,而樹不是。 – njbooher 2012-01-03 02:54:28

+0

創建一個簡單的包('mkdir otsf_web; touch otsf_web/__ init __。py'),然後創建三個文件:'matrix.py'(它將加載評分矩陣等),'web.py'有Flask特定的東西)和'tasks.py'(將有任務)。使用包含'otsf_web'目錄的同一目錄中的第四個腳本運行Web服務器:'from otsf_web.web import app; app.run()' – 2012-01-03 04:29:29

+0

@DavidWolever這種方法是線程安全的嗎?它是否支持像gunicorn這樣的服務器下的不同併發模型(線程,分支,gevent等)? – 2015-03-20 07:04:23

相關問題