【问题标题】:How do I pass values from one class to another; each running potentially on different threads?如何将值从一个类传递到另一个类;每个都可能在不同的线程上运行?
【发布时间】:2011-08-15 03:08:21
【问题描述】:

我有一个名为 filterspecs.py 的文件,其中包含 3 个内容:

  1. tls = threading.local()
  2. 继承自django.contrib.admin.views.main.ChangeList的A类
  3. 继承自django.contrib.admin.filterspecs.FilterSpec的B类

目标:我想将一个可用于A 实例的值list 传递给B 实例。由于 A 和 B 的生命周期由框架 (Django) 管理,因此我想不出私有方式在实例之间传递数据(使用 Queue 会有点过头了)。

尝试 #1 在使用 WSGI(守护程序)模式时失败。 在 A 类中,列表被添加到 threadlocal。

1.    tls.list_display = ['foo', 'bar']

但在 B 类中,以下返回 False

2.    hasattr(tls, 'list_display')

为了比较起见,如果我通过 apache/mod_wsgi 运行它,它可以在 apache/mod_wsgi 之外运行

manage.py runserver

我查看了日志,发现不同的线程正在执行第 1 行和第 2 行。

我还有什么其他方法可以解决这个问题?

【问题讨论】:

  • 我不明白这与线程有什么关系(在 Django 中很少使用线程,在管理中也没有使用线程)。请您能准确解释一下您要做什么 - 您在什么情况下使用这些类,为什么要在它们之间传递数据?
  • 我根本没有在我的代码中使用线程。基本上每次创建新的ChangeList 时,它都会使用我的FilterSpec 过滤查询集。 ChangeList 知道包含 list_display 的 ModelAdmin 并且我需要在我的 FilterSpec 中。如果有一种简单的 python 方式可以让我与 FilterSpec 共享该值?

标签: python django mod-wsgi wsgi


【解决方案1】:

听起来您不仅希望在两个类之间共享数据,而且还希望在两个完全不同的 HTTP 请求之间共享数据。 HTTP 是无状态的——Apache 不是为适应有状态的 Web 应用程序而设计的。您必须将数据保存到数据库并在第二个请求中读回。 (或者您可以在单独的进程中运行您的 Web 应用程序并自己管理状态 - 这实际上是在您的职位描述中添加了“数据库程序员”。不建议这样做。)

您的两段代码可能不仅仅在不同的线程中运行,它们可能在不同的进程中运行。

【讨论】:

  • 我只是仔细检查了一遍。它们使用相同的进程 ID 运行,但线程 ID 不同。
  • @Bon Ami:Apache 服务器作为单个进程运行是不寻常的。这是运气、仅使用一个客户端进行测试和 HTTP keepalive 的结合。没有好的方法可以保证同一个 Apache 进程会处理这两个请求。
  • 正在运行的两个线程不是 2 次调用的结果。我单击了一个链接(对数据进行排序),这反过来又导致了这种行为。请注意,我没有启动任何线程。 AB 类的生命周期都由 Django 管理。
  • 我不确定您所说的“通话”是什么意思。它们都是为处理相同的 HTTP 请求而创建的吗?
  • 通过 call,我的意思是一个 HTTP GET 或 POST 请求。是的。
猜你喜欢
  • 2013-03-16
  • 2011-08-26
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多