python – 跨多个mod_wsgi进程/线程共享变量

您是否可以在多个WSGI线程/进程之间共享一个对象(并且可以在* NIX和Windows上运行)?

基本前提:
(1)我有一个WSGI前端,将连接到后端服务器.我有一个序列化类,其中包含有关如何序列化/反序列化各种对象的规则,包括特定于此项目的类.因此,它需要有一些设置告诉它如何处理自定义对象.但是,它是无状态的 – 多个线程可以同时访问它以无问题地序列化它们的数据.
(2)有连接到后端的插座.每次有连接时,我宁愿拥有一个套接字池而不是创建/销毁.

注意:我不介意有(1)和(2)的多个实例的解决方案,但理想情况下,我希望尽可能少地创建/初始化它们.我不确定内部,但如果一个线程循环而不是关闭并让服务器重新打开一个新请求,那么每个线程有一个数据集就好了(因此,套接字和序列化器初始化一次线程,但重用它处理的每个后续调用.)实际上每个线程有一个套接字,如果它是如何工作的,那将是最好的,因为我不需要套接字池并且必须处理互斥锁.

注意:这不是会话,与会话无关.这不应该关心谁正在调用服务器.这只是关于在线程创建速度慢或者内存很多但CPU速度相对较慢的系统上调整性能的问题.

编辑2:以下代码将提供有关系统如何共享变量的一些信息.您需要加载页面几次才能获得一些诊断信息……

from datetime import *;
from threading import *;
import thread;
from cgi import escape;
from os import getpid;

count = 0;
responses = [];
lock = RLock();

start_ident = "%08X::%08X" % (thread.get_ident(), getpid());

show_env = False;

def application(environ, start_response):
    status = '200 OK';
    this_ident = "%08X::%08X" % (thread.get_ident(), getpid());


    lock.acquire();
    current_response = """<HR>
<B>Request Number</B>: """ + str(count) + """<BR>
<B>Request Time</B>: """ + str(datetime.now()) + """<BR>
<B>Current Thread</B>: """ + this_ident  + """<BR>
<B>Initializing Thread</B>: """ + start_ident  + """<BR>
Multithread/Multiprocess: """ + str(environ["wsgi.multithread"]) + "/" + str(environ["wsgi.multiprocess"]) +"""<BR>
"""
    global count;
    count += 1;

    global responses;
    responses.append(current_response)
    if(len(responses) >= 100):
        responses = responses[1:];
    lock.release();

    output="<HTML><BODY>";

    if(show_env):
        output+="<H2>Environment</H2><TABLE><TR><TD>Key</TD><TD>Value</TD></TR>";
        for k in environ.keys():
            output += "<TR><TD>"+escape(k)+"</TD><TD>"+escape(str(environ[k]))+"</TD></TR>";
        output+="</TABLE>";
    output += "<H2>Response History</H2>";
    for r in responses:
        output += r;
    output+="</BODY></HTML>"


    response_headers = [('Content-type', 'text/html'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

解决方法:

有关mod_wsgi进程/线程模型如何工作的一些阅读,请参阅:

> http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

请特别注意构建便携式应用程序的部分.

无论你使用什么WSGI服务器,那里的评论都没有任何不同.所有WSGI服务器也属于这些多进程/单进程,多线程/单线程类别之一.

上一篇:Python WSGI:不止一次读取env [‘wsgi.input’]


下一篇:PyPy PHP在一个网络服务器上