如何将值从一个类传递到另一个类;每个都可能在不同的线程上运行?

发布于 2024-11-29 17:02:18 字数 821 浏览 1 评论 0原文

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

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

目标:我想传递一个值,a list,可用于A的实例到B的实例。由于 A 和 B 的生命周期由框架(Django)管理,我无法想到在实例之间传递数据的私有方式(使用Queue将是一种矫枉过正)。

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

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

但在 B 类中,以下返回 False:

2.    hasattr(tls, 'list_display')

为了进行比较,如果我通过

manage.py runserver

查看日志运行它,它会在 apache/mod_wsgi 之外运行,我发现不同的线程正在执行第 1 行和第 2 行。 2.

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

I have a file called filterspecs.py that contains 3 things:

  1. tls = threading.local()
  2. class A which inherits from django.contrib.admin.views.main.ChangeList
  3. class B which inherits from django.contrib.admin.filterspecs.FilterSpec

Goal: I want to pass a value, a list, available to an instance of A to an instance of B. Since the lifecycle of A and B are managed by the framework (Django), I cannot think of private way to pass the data between the instances (Using a Queue would be an overkill).

Attempt #1 fails when using WSGI (daemon) mode.
In class A, the list is added to the threadlocal.

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

But in class B, the following returns False:

2.    hasattr(tls, 'list_display')

Just for comparison sake, this works outside of apache/mod_wsgi if I run it via

manage.py runserver

I looked at the logs and discovered that different threads were executing lines 1 & 2.

What other ways can I solve this problem ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

站稳脚跟 2024-12-06 17:02:18

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

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

It sounds like you want to share data between not just two classes, but between two completely different HTTP requests. HTTP is stateless -- Apache is not designed to accommodate stateful web applications. You must save the data to a database and read it back in the second request. (Or you can run your web application in a separate process and manage the state yourself -- which essentially adds "database programmer" to your job description. This is not recommended.)

Your two pieces of code might not just be running in different threads, they might be running in different processes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文