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