编辑以澄清我的问题:我想使用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()
)并返回一个响应。你正在交易一点时间学习芹菜以节省必须写一堆协调代码。