flask(uwsgi)应用程序上的后台驻留程序后台任务

时间:2018-06-27 23:16:53

标签: python flask uwsgi background-task

编辑以澄清我的问题: 我想使用this feature在uwsgi上附加python服务(我无法理解示例),并且我还希望能够在它们之间传递结果。在下面,我介绍了一些情况,也提出了我对沟通问题的第一个想法,期望可能会提出一些建议或采取其他方法。


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

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

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

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

我的主要问题之一是我看了这些示例,但不知道下一步需要做什么。换句话说,我如何从那里启动python应用程序?

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


注意: 我对Celery非常了解,因此我假装在不久的将来使用它。实际上,我已经开发了一个node.js应用程序,用户可以在该应用程序上执行应触发(也)已经开发的python应用程序中的特定任务的操作。关键是,我需要尽快可用于生产的版本,而不是修改使用multiprocessing的python应用程序,我认为创建一个简单的flask会更快服务器通过HTTP与node.js进行通信。这样,我只需要实现实例化python应用程序的flask应用程序即可。


编辑:

为什么需要共享对象?

仅因为在问题中创建对象花费的时间太长。实际上,如果创建一次,则创建会花费可接受的时间,但是,由于我期望(也许)数百到数千个请求同时不得不再次加载每个对象,因此我想避免这种事情。

对象之一是scikit分类器模型,该模型持久保存在pickle文件中,需要3秒钟来加载。每个用户可以创建几个“工作位”,每个工作位将接管2k多个文档进行分类,每个文档将在未知的时间点上载,因此我需要将此模型加载到内存中(针对每个任务再次加载该模型)不可接受)。

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


修改2: 我之前曾问过一些与此项目有关的问题:

如上所述,但要澄清一下:我认为最好的解决方案是使用Celery,但是为了快速拥有可用于生产的解决方案,我尝试使用此uWSGI附加守护程序解决方案

1 个答案:

答案 0 :(得分:0)

我可以看到挂在multiprocessing.Pool上的诱惑。我在生产中将其用作管道的一部分。但是Celery(我也在生产中使用过)更适合您要尝试的工作,因为Celery将工作跨内核分配到设置成本很高的资源上。有N个核心?启动N个芹菜工人,其中的一个可以在全球范围内加载(或延迟加载)昂贵的模型。请求进入应用程序,启动任务(例如,task = predict.delay(args),等待任务完成(例如,result = task.get())并返回响应。您花了一些时间学习芹菜节省了编写一堆协调代码的时间。