【问题标题】:replay in django + apache + mod_wsgi?在 django + apache + mod_wsgi 中重播?
【发布时间】:2011-02-04 14:16:06
【问题描述】:

我有一个简单的 django 页面,上面有一个计数器。 我使用 Apache2 和 mod_wsgi 来服务它。

首先,当我进入这个页面时,计数器显示为 0,这是应该的。 当我第二次进入页面时,计数器显示 1 - 再次,这是正确的行为。 现在问题开始了,因为当我第三次进入这个页面时,我又得到了0。

当我刷新它时,它介于 0 和 1 之间,显然使用了一些缓存。 如果我等待一段时间然后再试一次,它会显示 2 和 3,但会停留在这些值上,直到这个缓存或任何它被刷新,然后计数器继续。

有人知道我怎样才能让它正常工作吗(真实的场景是从数据库中获取数据,但是这个奇怪的缓存的问题是一样的)。

顺便说一句,我的 django 设置中没有设置任何缓存引擎。

【问题讨论】:

    标签: django apache caching wsgi


    【解决方案1】:

    其他海报建议的实例数!= 进程 * 线程。实例数 == 仅限进程。

    阅读:

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

    您可能正在运行嵌入式模式。您应该改用守护程序模式。

    不要设置 'processes=1',因为无论如何这都是默认设置,并且使用该选项会产生您可能不想要的其他副作用。

    守护程序模式的默认线程数是 15,只要您的应用程序是线程安全的就可以了。具体来说,对全局计数器的访问应该是线程安全的。

    另请阅读:

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

    其中有一个如何设置守护程序模式的示例。您需要同时使用 WSGIDaemonProcess 和 WSGIProcessGroup 指令,只有 WSGIDaemonProcess 是不够的。

    【讨论】:

    • 感谢您的信息。 同时服务的客户端数量 = 进程 * 线程是否仍然正确?
    • 理论上并发请求数的最大值是进程 * 线程,但是进程中的所有线程通常在特定应用程序的同一个解释器实例中运行。阅读'blog.dscpl.com.au/2009/03/…',我想我在里面谈了一些这类东西。
    【解决方案2】:

    您正在运行 Django 的多个实例。 Apache 随机连接到其中之一。

    出于测试目的,请在您的 apache.conf 中尝试:

    WSGIDaemonProcess mysite processes=1 maximum-requests=500 threads=1
    

    (您可能希望在生产中使用更多进程。)

    请参阅full documentation 的选项。

    【讨论】:

    • 谢谢!由于某种原因,我没有想到这个简单的答案。您知道如何更改这些实例的数量,以及将实例数量减少到 1 的后果是什么?
    • 实例数 == 进程 * 线程。如果只有一个实例正在运行,那么一次只能为一个客户端提供服务,这会使您的应用程序对用户来说很慢,假设有多个同时存在的用户。
    猜你喜欢
    • 2012-03-17
    • 1970-01-01
    • 2013-02-12
    • 2014-11-29
    • 1970-01-01
    • 2010-11-08
    • 2012-11-04
    • 2011-07-14
    • 2016-03-15
    相关资源
    最近更新 更多