【问题标题】:Is a single Python executable file shared by all clients when run on a server?在服务器上运行时,所有客户端是否共享单个 Python 可执行文件?
【发布时间】:2013-11-03 06:35:39
【问题描述】:

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

【问题讨论】:

  • 文件和进程是不同的东西。不同的进程可以共享同一个可执行文件,而不共享全局变量、标准输入/输出或其他全局状态。

标签: python django heroku tornado


【解决方案1】:

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

【讨论】:

  • 这适用于 PHP 风格的环境,但在 Tornado 中,一个进程将同时为多个客户端提供服务。
【解决方案2】:

当您在本地计算机上运行时,执行流程应该相同。取以下代码:-

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 应用程序中,在不显式传递参数的情况下在函数之间保持一些共享状态的方法是使用线程本地对象。我对龙卷风了解不多,但从简短的阅读来看,它似乎没有在线程内运行,因此您必须查阅文档以找出在函数之间共享状态的推荐方式。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多