Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在服务器上运行时,所有客户端是否共享一个Python可执行文件?_Python_Django_Heroku_Tornado - Fatal编程技术网

在服务器上运行时,所有客户端是否共享一个Python可执行文件?

在服务器上运行时,所有客户端是否共享一个Python可执行文件?,python,django,heroku,tornado,Python,Django,Heroku,Tornado,我一直在本地机器上运行server.py来处理Tornado项目。部署到服务器(例如Heroku)时,所有客户端是否共享一个server.py实例,或者每个客户端是否都有自己的运行版本?我想知道这一点,因为我正在考虑使用server.py中的全局变量,并想知道它们是在所有客户机之间共享还是只在单个客户机上共享。每个客户机都有自己的运行版本。肯定 如果您想拥有某种全局变量,应该使用一些进程间通信工具(消息传递、同步、共享内存或rpc)。例如,Redis 在本地计算机上运行时,执行流应该相同。以下面

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

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

在本地计算机上运行时,执行流应该相同。以下面的代码为例:-

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请求


通常在普通的PythonWSGi应用程序中,在函数之间保持某种共享状态而不显式传递参数的方法是使用线程本地对象。我对tornado知之甚少,但从一篇简短的阅读来看,它似乎没有在线程内运行,因此您必须查阅文档,以找到在函数之间共享状态的推荐方式。

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

文件和进程是不同的。不同的进程可能共享同一个可执行文件,而不共享全局变量、stdin/out或其他全局状态。PHP风格的环境也是如此,但在Tornado中,一个进程将同时服务于多个客户端。