Python服务器中的全局变量

Her*_*utt 7 python webserver global-variables

背景:在服务器方面,我是一个完全的初学者,但我知道我在Python中编程的方法.

我正在尝试使用基本的Python 2.7模块(SimpleHTTPServer,CGIHTTPServer等)设置一个简单的服务器.此服务器需要在启动时从文件加载一个包含几GB数据的全局只读变量; 然后,当每个用户访问该页面时,服务器使用大数据生成一些输出,然后将该输出提供给用户.

为了举例,假设我有一个4 GB的文件names.txt,其中包含所有可能的英语专有名词:

Jack
John
Allison
Richard
...
Run Code Online (Sandbox Code Playgroud)

让我们假设我的目标是将整个名称列表读入内存,然后从这个专有名词列表中随机选择1个名称.我目前能够使用Python的原生CGIHTTPServer模块来实现这一目标.首先,我通过从终端执行直接运行CGIHTTPServer模块:

python -m CGIHTTPServer
Run Code Online (Sandbox Code Playgroud)

然后,有人访问,www.example-server.net:8000/foo.py并随机给他们一个这样的名字.我有以下代码foo.py:

#!/usr/bin/env python

import random

name_list = list()
FILE = open('names.txt','r')
for line in FILE:
    name = line[:-1]
    name_list.append(name)

FILE.close()
name_to_return = random.choice(name_list)

print "Content-type: text/html"
print
print "<title>Here is your name</title>"
print "<p>" + name_to_return + "</p>"
Run Code Online (Sandbox Code Playgroud)

这就是我想要的; 但是,效率非常低,因为每次访问都会强制服务器重新读取4 GB文件.

如何将其转变为一个高效的过程,在name_list服务器启动时,变量立即创建为全局变量,每个访问只从该变量读取?

Her*_*utt 5

仅供将来参考,如果有人遇到同样的问题:我最终得到了子类CGIHTTPServer的请求处理程序并实现了一个新do_POST()函数.如果你有一个没有全局变量的工作CGI脚本,这样的事情应该让你开始:

import CGIHTTPServer
import random
import sys
import cgi

class MyRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler):
    global super_important_list
    super_important_list = range(10)
    random.shuffle(super_important_list)

    def do_POST(s):    
        """Respond to a POST request."""
        form = cgi.FieldStorage(fp=s.rfile,headers=s.headers,environ={'REQUEST_METHOD':'POST','CONTENT_TYPE':s.headers['Content-Type'],})
        s.wfile.write("<html><head><title>Title goes here.</title></head>")
        s.wfile.write("<body><p>This is a test.</p>")
        s.wfile.write("<p>You accessed path: %s</p>" % s.path)
        s.wfile.write("<p>Also, super_important_list is:</p>")
        s.wfile.write(str(super_important_list))
        s.wfile.write("<p>Furthermore, you POSTed the following info: ")
        for item in form.keys():
            s.wfile.write("<p>Item: " + item)
            s.wfile.write("<p>Value: " + form[item].value)
        s.wfile.write("</body></html>")

if __name__ == '__main__':
    server_address = ('', 8000)
    httpd = CGIHTTPServer.BaseHTTPServer.HTTPServer(server_address, MyRequestHandler)
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        sys.exit()
Run Code Online (Sandbox Code Playgroud)

每当有人填写您的表单并执行POST时,该变量form将是一个类似字典的对象,其键值对可能因站点的每个用户而异,但全局变量super_important_list对于每个用户都是相同的.

感谢所有回答我问题的人,特别是Mike Steder,他指出了我正确的方向!