0

我一直在通过运行 server.py 在本地计算机上处​​理 Tornado 项目。当部署到服务器(例如 Heroku)时,server.py 的单个实例会被所有客户端共享还是每个客户端都有自己的运行版本?我想知道这一点,因为我正在考虑使用 server.py 中的全局变量,并想知道它们是否会在所有客户端或单个客户端之间共享。

4

3 回答 3

1

每个客户端都有自己的运行版本。确实。如果你想拥有某种全局变量,你应该使用一些进程间通信工具(消息传递、同步、共享内存或 rpc)。以 Redis 为例。

于 2013-11-03T06:52:48.407 回答
0

使用 Tornado,每台机器/VM 至少有一个进程(Heroku 将这些称为“dynos”);在多核环境中,您需要在每台机器上运行多个进程(每个核心一个)。每个进程处理许多用户,因此在只有一个进程的简单情况下,您可以使用全局变量在用户之间共享状态,尽管随着您发展到多个 dyno 和进程,您将需要某种进程间通信。

于 2013-11-03T20:43:39.877 回答
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将为每个传入请求获得新状态。我假设您问题中的“客户”是指传入的网络请求。

通常在普通的 python wsgi 应用程序中,在函数之间保持一些共享状态而不显式地向下传递参数的方法是使用线程本地对象。我对龙卷风不太了解,但从简短的阅读来看,它似乎没有在线程内运行,因此您必须查阅文档以找出在函数之间共享状态的推荐方式。

于 2013-11-03T14:03:35.753 回答