2017-02-19 97 views
3

我有燒瓶應用程序,它傾聽一些工作要做。這個過程很長(讓我們說1分鐘),我不想同時處理兩個請求。燒瓶,處理請求1 by 1

如果一旦我收到請求,我會很好,我可以關閉正在收聽的端口燒瓶,並在完成後再次打開。或者我可以設置一個信號燈,但我不知道如何同時運行燒瓶。

有什麼建議嗎?

from flask import Flask, request 
app = Flask(__name__) 

@app.route("/",methods=['GET']) 
def say_hi(): 
    return "get not allowed" 

@app.route("/",methods=['POST']) 
def main_process(): 
    # heavy process here to run alone 
    return "Done" 

if __name__ == "__main__": 
    app.run(debug=True,host='0.0.0.0') 
+0

你是如何運行燒瓶刨?直接通過燒瓶還是將它作爲WSGI模塊運行? –

+0

我正在使用wsgi模塊 – mosh442

+1

在這種情況下,它可能會更復雜一點。一個WSGI服務器(取決於配置)可以並行產生多個進程,但是Python的鎖只能跨線程工作,而不能跨越進程。您需要引入可以鎖定的共享資源。這可能是數據庫,文件或共享鎖,例如[named semaphore](http://stackoverflow.com/q/2798727)。 –

回答

1

你可以使用一個信號量這樣的:

import threading 
import time 
sem = threading.Semaphore() 

@app.route("/",methods=['POST']) 
def main_process(): 
    sem.acquire() 
    # heavy process here to run alone 
    sem.release() 
    return "Done" 

信號燈的使用是控制訪問的公共資源。

你可以看到有關信號的詳細信息在這裏enter link description here

這太問題可以幫助你以及enter link description here

編輯:

正如喬治·Schölly在評論中寫道,上述方案在多種服務的情況下是有問題的。

雖然,您可以使用wsgi來完成您的目標。

@app.route("/",methods=['POST']) 
def main_process(): 
    uwsgi.lock() 
    # Critical section 
    # heavy process here to run alone 
    uwsgi.unlock() 
    return "Done" 

uWSGI支持鎖的配置數量可用於同步工作進程

欲瞭解更多信息,請閱讀here

+0

如果有多個進程,這不起作用。這裏的鎖不適用於多個進程,這是Web服務器的正常配置。 –

+0

@GeorgSchölly,感謝您的評論,我添加了關於您評論的編輯部分。 –

0

你可以嘗試添加threading.Lock表明,一些工作已經在進行中:

import threading 
from contextlib import ExitStack 

busy = threading.Lock() 
@app.route("/",methods=['POST']) 
def main_process(): 
    if not busy.acquire(timeout = 1): 
     return 'The application is busy, refresh the page in a few minutes' 

    # ensure busy.release() is called even if an exception is thrown 
    with ExitStack() as stack: 
     stack.callback(busy.release) 
     # heavy process here to run alone 

    return "Done" 

但是燒瓶中默認允許一次(更多信息here)要處理的只有一個要求,所以如果你在處理單個請求的過程中沒有問題,那麼所有其他用戶的頁面在加載完成之前都不會被加載(甚至可能發生請求超時錯誤),所以你不需要改變任何東西。
如果您想讓其他用戶收到一條消息,例如上面的代碼,請將工作人員數量增加到2,以便當一個工作人員處理請求時,另一個工作人員將阻止其他用戶。

+0

如果沒有鎖,這很容易出現競爭狀況。 –

+0

@GeorgSchölly好點。編輯爲使用鎖 – Leva7

+0

如果有多個進程,這不起作用。這裏的鎖不適用於多個進程,這是Web服務器的正常配置。 –