Python uwsgi中工人之间的沟通

Python uwsgi中工人之间的沟通,python,django,multithreading,ipc,uwsgi,Python,Django,Multithreading,Ipc,Uwsgi,我对Python比较陌生,来自.Net背景 简短版本:如何创建应用程序范围的单例或其他机制,以允许多个线程/进程相互通信 也许我被宠坏了,但在.Net中,我会在App\u Start中创建一些东西,或者在“应用程序级别”创建一些其他东西。如何在python/uwsgi中实现同样的功能 长版本: 我们有一个使用Django编写的restful API 有些调用需要一些预处理,然后传递给执行长时间运行操作的后端系统 目前的流量看起来有点像 接收处理符合给定条件的所有文档的请求 Api确定哪些文档符

我对Python比较陌生,来自.Net背景

简短版本:如何创建应用程序范围的单例或其他机制,以允许多个线程/进程相互通信

也许我被宠坏了,但在.Net中,我会在
App\u Start
中创建一些东西,或者在“应用程序级别”创建一些其他东西。如何在python/uwsgi中实现同样的功能

长版本:

我们有一个使用Django编写的restful API

有些调用需要一些预处理,然后传递给执行长时间运行操作的后端系统

目前的流量看起来有点像

  • 接收处理符合给定条件的所有文档的请求
  • Api确定哪些文档符合这些标准(大约100000个-需要15-20秒)
  • Api为此批处理请求生成uuid
  • Api将引用批id的消息发布到每个文档的后端队列
  • Api侦听不同队列中的“已完成”消息,并统计每个批处理id的成功/失败次数(~1-15分钟)
  • 在处理过程中,UI可以请求特定批次id的更新
我们需要使用与服务页面不同的线程来侦听响应队列,因为它位于

我通过获取对
QueueManager
的引用来处理这个问题,它是一个单例。管理器触发初始请求,记录批id,然后在第二个线程中监视队列并更新本地状态

实际上,我们并不关心长期保存状态——如果消息在队列中,处理将由后端完成,状态监视只是向用户提示事情正在进行。如果他们不浏览,他们也会失去对状态的访问(批处理id存储在JS中的内存中)

这有两个好处——我们避免了使用数据库来同步信息(以及相关的清理)。我们可以使用单个线程作为消息使用者,并且不必担心并发问题,因为只有一个线程将收集消息/更新本地状态

所以。。。现在是使用uwsgi运行它的时候了,我发现了一个主要问题。如果我将进程数设置为1,则singleton会按预期工作,但在api处理数据的15-20秒内,所有请求都会被阻止。显然,这是不可接受的。相反,如果我启动多个worker,每个worker都有自己的singleton和自己的消息侦听器——因此,如果发布者和消费者是同一个进程,那么这几乎是随机的。即使是这样,状态更新请求也可能不会在同一个过程中结束

如何在多个工作人员之间交换状态信息?有没有一种方法可以使用多个线程而不是多个工作线程

看来我真的需要:

  • n个线程,每个线程提供请求
  • 1个线程正在侦听队列
  • 有些是记忆中他们之间交流的方式

注意,我已经得到了
--启用线程
,但这似乎只适用于我生成的新线程(不知道为什么默认情况下不会启用)

要生成多个线程,只需添加--threads N,其中N是要生成的线程数


请注意,只有当您只有一个工人/流程时,它才会起作用。另一种常见的方法是使用uWSGI缓存框架(名称有误导性,实际上是一个共享字典)。它将允许您在工作线程和线程之间共享数据。

找到了解决方案吗?@will遗憾的是,没有,文档非常糟糕。似乎有一个uwsgi管理流程可以根据需要重新启动uwsgi流程。我们想要一个进程多个线程,而不是一个线程多个进程。无论如何,我们最终离开了uwsgi,所以我从未解决过这个问题。祝你好运
while True:
    self.channel.wait()