【问题标题】:How django handles simultaneous requests with concurrency over global variables?django 如何在全局变量上处理并发请求?
【发布时间】:2012-10-21 17:34:54
【问题描述】:

我有一个通过 apache/mod_wsgi 托管的 django 实例。我使用pre_savepost_save 信号来存储保存前后的值以供以后比较。为此,我使用全局变量来存储可以在 post_save 信号处理程序中访问的 pre_save 值。

我的问题是,如果两个请求 A 和 B 同时请求同一个 Web 服务,它会并发吗? B 不应该读取 A 写入的全局变量,反之亦然。

PS:我没有在变量上使用任何线程Lock

【问题讨论】:

    标签: python django apache concurrency mod-wsgi


    【解决方案1】:

    这部分取决于您的mod_wsgi 配置。如果将其配置为每个进程只使用一个线程,那么全局变量是安全的——尽管出于各种原因我不建议使用它们。在多线程配置中,如果使用全局变量,则无法保证请求不会混淆。

    您应该能够在pre_savepost_save 之间找到更多本地存储所需数据的地方。我建议您在设计中多考虑一下。

    【讨论】:

    • @KayZhu,我很乐意为您提供帮助!查看WSGIDaemonProcess 指令,尤其是“进程”和“线程”选项,了解一些可用的变体。
    • 谢谢!我只是在这个页面上阅读同一个维基:Building a portable application
    • @KayZhu Ah,直接回答问题的更好参考。 +1!
    • 您可以使用 Python 标准 threading 库来帮助处理线程本地存储。请参阅threading.local 文档。
    • 无论WSGIDaemonProcess 是如何配置的,我都建议您编写代码以使其正常工作,这意味着避免全局可变状态。 (再次,请参阅@KayZhu 建议的Building A Portable Application。)您可以使用threading.local 为您的问题生成正确的解决方案,但我的偏好是避免线程本地存储,因为它使程序的数据流不太清晰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2012-10-05
    • 2023-03-03
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多