2011-07-19 29 views
4

我在python中創建了一個應用程序,該應用程序使用web服務器爲前端提供服務,並且在接受數據作爲web請求後,將任務轉發到作業隊列,該作業隊列與主處理函數使用一個線程。python wsgi服務器中的全局對象

但問題是,python web服務器試圖導入自己來運行線程,並在這個過程中幾乎每個請求創建一個新的作業隊列,這打破了邏輯。有沒有什麼辦法可以在python web服務器上設置全局變量,因爲python Queue是線程安全的,我假設它不會造成任何傷害。

(我想兩個web服務器燒瓶中並web.py)

+0

當你使用燒瓶你禁用腳本對文件的更改自動重裝?我想這是你的問題。 – Bastian

+0

是的,我做了,但腳本正在導入自己創建線程來處理請求。 – Pankaj

回答

-2

共享數據最好存儲在數據庫中。

如果您想爲每個用戶的會話設置一個全局變量,那麼您希望將這些數據與會話數據一起存儲:這裏是details for web.pyfor flask

如果你有一個持續的進程正在處理一個隊列,你可以看看用FastCGI運行你的服務器,你的python服務器可以在你的web服務器的一個獨立實例中運行。看看如何配置FastCGI for web.py - 看看是否合適。 Web服務器將通過它自己的端口與Python服務器通信,因此您的Python服務器可以繼續運行並維護任何全局數據。

[編輯]

既然你需要共享的變量 - 你可以檢查出flask.g的瓶,或web.ctx爲web.py.我從來沒有使用它們 - 所以我不知道是否有惡意影響或性能問題。我看到an example here這表明在web.py做這樣的事情:

import web 

def add_global_hook(): 
    g = web.storage({"counter": 0}) 
    def _wrapper(handler): 
     web.ctx.globals = g 
     return handler() 
    return _wrapper 

class Hello: 
    def GET(self): 
     web.ctx.globals.counter += 1 
     return "<h1>Counter: %d</h1>" % web.ctx.globals.counter 

if __name__ == '__main__': 
    urls = ("/", "Hello") 
    app = web.application(urls, globals()) 
    app.add_processor(add_global_hook()) 
    app.run() 
+1

我想共享python對象,所以數據庫被排除了 – Pankaj

+0

我添加了一些我在全局變量上看到的信息 - 但我從來沒有使用過這些信息,我不知道它們的含義。 –