0

对不起,如果这没有意义。如果需要澄清,请发表评论。

我正在 web.py 中编写一个小文件上传应用程序,我正在使用 mod_wsgi + apache 进行部署。我的会话管理一直有问题,想澄清一下 web.py 中的线程是如何工作的。

本质上,当有人访问我的页面时,我将代码嵌入到我呈现的 html 页面的隐藏字段中。然后通过包含文件和代码的标准 POST 请求完成文件上传。然后,我通过在文件上传 POST 方法中更新文件并使用对不同类的 GET 请求获取它来检索文件的进度。“会话”(为它相当幼稚而道歉)存储在这样的会话对象中:

class session:

    def __init__(self):

        self.progress = 0
        self.title = ""
        self.finished = False

    def advance(self):

        self.progress = self.progress + 1 

这些会话都保存在我的应用程序脚本中的全局字典中,然后使用我的代码(从之前的代码)作为键进行访问。

出于某种原因,我的进度似乎保持在 0 并且永远不会增加。我已经调试了几个小时,我发现上传类和进度类引用的两个会话对象不一样。然而,这两个代码(据我所知)是相等的。这让我发疯,因为它在我本地机器上的 web.py 测试服务器上没有任何问题。

编辑:经过一些研究,似乎每个请求都会复制字典。我尝试将字典放在另一个字典中并导入,但这不起作用。除了使用数据库来“分离”会话字典还有其他方法吗?

4

2 回答 2

1

Apache/mod_wsgi 可以在多进程配置中运行,并且您的请求甚至可能不会由同一个进程提供服务,并且如果对于该多进程配置,每个进程都是单线程的,则永远不会,因为在进行上传时,没有其他请求可以由同一进程处理过程。读:

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

可能您应该使用带有单多线程守护进程的 mod_wsgi 守护进程模式。

于 2011-02-08T07:38:08.733 回答
0

PEP 333开始,定义 WSGI:

可以并行运行多个请求的服务器还应该提供以单线程方式运行应用程序的选项,以便非线程安全的应用程序或框架仍然可以与该服务器一起使用

检查 WSGI 服务器的文档。

于 2011-02-07T23:16:52.523 回答