uwsgi工人之间的沟通

时间:2013-04-30 16:08:17

标签: python django multithreading ipc uwsgi

我是一个相对较新的Python,来自.Net背景。

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

也许我被宠坏了但是在.Net中,我只是在App_Start或“应用程序级别”的其他内容中创建了一些东西。我怎样才能在python / uwsgi中做同样的事情?

长版:

我们使用Django编写了一个安静的API。

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

此刻的流程看起来像......

  • 接收处理符合给定条件的所有文件的请求
  • Api确定哪些文件符合这些标准(大约100,000个 - 需要15-20秒)
  • Api为此批量请求生成uuid
  • Api向每个文档的后端队列发布一条消息,引用批次ID。
  • Api在不同的队列中侦听“已完成”的消息并计算每个批次ID的成功/失败(约1-15分钟)
  • 在处理过程中,UI可以请求更新特定批次ID

我们需要使用与用于提供页面的线程不同的线程来侦听响应队列,因为它位于wait spin-loop ...

while True:
    self.channel.wait()

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

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

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

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

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

似乎我真的需要:

  • n个线程,每个服务请求
  • 1个线程侦听队列
  • 他们之间进行通信的一些内存方式

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

1 个答案:

答案 0 :(得分:0)

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

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