烧瓶(uwsgi)应用程序上的守护进程后台任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了烧瓶(uwsgi)应用程序上的守护进程后台任务相关的知识,希望对你有一定的参考价值。

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


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

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

我在这里阅读了几个问题,寻找使用python多处理模块的烧瓶的可能缺点。我仍然有点困惑,但this answer总结了直接从烧瓶开始一个multiprocessing.Pool的缺点和我的选择。

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

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

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


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


编辑:

为什么我需要共享对象?

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

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

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


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

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

答案

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

以上是关于烧瓶(uwsgi)应用程序上的守护进程后台任务的主要内容,如果未能解决你的问题,请参考以下文章

Linux守护进程详解

烧瓶中写入数据库的后台任务

[Python网络编程]浅析守护进程后台任务的设计与实现

Unix环境高级编程(十四)守护进程实现时间服务器

守护进程

创建守护进程-转