【问题标题】:Daemon background tasks on flask (uwsgi) application烧瓶(uwsgi)应用程序上的守护进程后台任务
【发布时间】:2018-06-27 23:16:52
【问题描述】:

编辑以澄清我的问题: 我想使用this feature 在uwsgi 上附加一个python 服务(我无法理解这些示例),并且我还希望能够在它们之间交流结果。下面我介绍一些背景,并介绍我对沟通问题的第一个想法,期待一些建议或其他方法。


我已经开发了一个使用multiprocessing.Pool 来运行按需任务的python 应用程序。使用工人池的主要原因是我需要在他们之间共享几个对象。

最重要的是,我想要一个从其端点触发任务的烧瓶应用程序。

我在这里阅读了几个关于 SO 的问题,以寻找将烧瓶与 python 的多处理模块一起使用的可能缺点。我仍然有点困惑,但this answer 很好地总结了直接从烧瓶启动multiprocessing.Pool 的缺点以及我的选择。

此答案显示uWSGI feature to manage daemon/services。我想遵循这种方法,这样我就可以将我已经开发的 python 应用程序用作烧瓶应用程序的服务。

我的一个主要问题是我查看示例但不知道接下来我需要做什么。换句话说,我将如何从那里启动 python 应用程序?

另一个问题是关于烧瓶应用程序和守护进程/服务之间的通信。我的第一个想法是使用flask-socketIO 进行通信,但是,如果我的服务器停止,我需要处理连接......这是服务器和服务之间通信的好方法吗?还有哪些可能的解决方案?


注意: 我很了解 Celery,我假装在不久的将来会使用它。事实上,我有一个已经开发的 node.js 应用程序,用户在该应用程序上执行应该触发(也)已经开发的 python 应用程序的特定任务的操作。问题是,我需要尽快生产就绪版本,而不是修改使用multiprocessing的python应用程序,我认为创建一个简单的flask服务器会更快通过 HTTP 与 node.js 通信。这样我只需要实现一个烧瓶应用程序来实例化 python 应用程序。


编辑:

为什么需要共享对象?

仅仅是因为创建问题中的对象需要太长时间。实际上,如果只完成一次创建需要的时间是可以接受的,但是,由于我预计(可能)成百上千个请求同时必须再次加载每个对象,这将是我想要避免的事情。

其中一个对象是一个 scikit 分类器模型,它保存在一个 pickle 文件中,加载需要 3 秒。每个用户可以创建几个“工作点”每个将接管 2k 个文档进行分类,每个文档将在未知时间点上传,所以我需要将这个模型加载到内存中(为每个任务再次加载它是不可接受)。

这是单个任务的一个示例。


编辑 2: 我之前问过一些与这个项目相关的问题:

如上所述,但要澄清一下:我认为最好的解决方案是使用 Celery,但为了快速获得生产就绪的解决方案,我尝试使用这个 uWSGI attach daemon 解决方案

【问题讨论】:

  • 您忘记告诉我们您要解决的实际问题是什么。
  • 我确实做到了,它更侧重于第 2 到第 6 段。我在“注意”部分全面介绍了该问题。如前所述,我想在我的 python 多处理程序(第 2 段)之上构建一个烧瓶应用程序,我发现的可能方法在提供的 SO 链接(第 3 段)上。我指定了我想要遵循的方法(第 4 段)并提出了我必须继续开发的主要问题(第 5 和第 6 段)
  • 以一种明确的方式,我想使用uWSGI feature启动一个python守护进程/服务,并从服务和flask应用程序中传递结果。如果这不是你的意思,请详细说明
  • 是和不是。他们可能得到的是,你已经为一些你没有真正详细解释为什么需要它的问题概述了一个解决方案。然后你问如何让你的解决方案工作。更多地研究实际问题或您需要它的原因的原因是,有人可能会建议一种完全不同的方法,这种方法可能更简单或更合适。得到这样的回应并不少见,因为关于 SO 的许多问题都是这样的。当通常有更好的解决方案开始时,请帮助我解决这个特定的解决方案。
  • 您添加的“为什么”很棒。为实现这一总体目标,您是否看过 Dask (dask.pydata.org/en/latest)?它是一种跨进程分布大型数据集,然后能够跨进程运行作业的方法。它适用于 numpy/pandas/scikit 等包。换句话说,解决问题的一种方法是使用迷你 dask 集群,即使同一节点上有多个工作进程,然后使用 dask 客户端 API 将任务提交到工人。

标签: python flask uwsgi background-task


【解决方案1】:

我可以看到坚持multiprocessing.Pool 的诱惑。我在生产中使用它作为管道的一部分。但是 Celery(我也在生产中使用)更适合您正在尝试做的事情,即将工作跨内核分配到设置成本高昂的资源。有N个核心吗?启动 N 个 celery 工作人员,其中可以将昂贵的模型加载(或者延迟加载)作为全局模型。一个请求进入应用程序,启动一个任务(例如,task = predict.delay(args),等待它完成(例如,result = task.get())并返回一个响应。你用一点时间学习芹菜来节省不得不写一堆协调代码。

【讨论】:

    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 2012-09-01
    • 2014-05-02
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多