2013-11-03 49 views
0

我一直在使用server.py在本地機器上運行Tornado項目。當部署到服務器(例如Heroku)時,所有客戶端將共享一個server.py實例還是每個客戶端都有自己的運行版本?我想知道這是因爲我想在server.py中使用全局變量,並想知道它們是在所有客戶端還是僅在一個客戶端共享。在服務器上運行時,所有客戶端是否共享一個Python可執行文件?

+1

該文件和過程是不同的東西。不同的進程可能共享相同的可執行文件,而不共享全局變量,stdin/out或其他全局狀態。 – user2357112

回答

0

執行流程應該是相同的。看看下面的代碼: -

import tornado.ioloop 
import tornado.web 

print 'This is executed only once and global' 
name = 'myname' 

class MainHandler(tornado.web.RequestHandler): 
    print 'This is executed only once' 
    def get(self): 
     print 'This is executed for each requests' 
     self.write("Hello, world %s " % name) 

application = tornado.web.Application([ 
    (r"/", MainHandler), 
]) 

if __name__ == "__main__": 
    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 

時,我們會得到以下的輸出: -

$ ./bin/python server.py 
This is executed only once and global 
This is executed only once 



This is executed for each requests 
WARNING:tornado.access:404 GET /favicon.ico (::1) 0.52ms 
This is executed for each requests 
WARNING:tornado.access:404 GET /favicon.ico (::1) 0.25ms 

這意味着類主體以外的代碼每當服務器啓動和任何狀態將被執行將保持在那裏直到重新啓動。當服務器啓動時,它還實例化類MainHandler,並且對於每個傳入請求,將調用實例上的get方法。這意味着類主體中的代碼也將被執行一次,並且只有方法get中的代碼纔會獲得每個傳入請求的新狀態。我假設你的問題中的'客戶'是指傳入的Web請求。

一般在正常蟒WSGI應用中,方式來保持功能之間的一些共享狀態,而不會顯式地傳遞參數向下鏈是使用線程局部對象。我對龍捲風知之甚少,但從簡短的閱讀看來,它似乎並不在線程內運行,所以你必須查閱文檔以找出推薦的功能共享狀​​態。

1

每個客戶端都有自己的運行版本。當然。 如果您想要某種全局變量,您應該使用一些進程間通信工具(消息傳遞,同步,共享內存或rpc)。例如,Redis。當你在本地計算機上運行它

+0

這是PHP風格的環境,但在Tornado中,一個進程將同時爲多個客戶端提供服務。 –

0

隨着龍捲風你必須每臺機器至少一個過程/ VM(Heroku上稱這些「DYNOS」);在多核環境中,您希望每臺計算機運行多個進程(每個核心一個進程)。每個進程處理許多用戶,所以在只有一個進程的簡單情況下,您可以使用全局變量共享用戶之間的狀態,但隨着您成長爲多個進程和進程,您需要進行某種進程間通信。

相關問題