在Django

时间:2015-04-28 18:13:20

标签: python django celery django-celery

我目前为项目和一个Web应用程序设置了典型的Django结构。

设置Web应用程序以便用户输入一些信息,并将此信息作为运行Python程序的输入。

这个python程序有时可能需要很长时间才能完成(从网上获取内容并进行一些文本挖掘评分) - 有时可能需要多分钟才能加载。

在命令行上,这个程序会定期显示它在这个过程中的位置(它首先说明了它发现了多少东西,然后它会说明发现它的数量在哪里评分过程),这非常有用。但是,当我将其移动到Django设置时,我不再具有此功能(至少,不是以同样的方式,因为现在这被发送到日志文件)。

我设置的方式是输入视图,然后是结果视图。结果视图接受输入并运行Python程序。在整个程序运行之前,它不会显示结果。所以在用户方面,浏览器只是在显示结果之前有几分钟就坐在那里。显然,这并不理想。

有没有人知道将任务状态信息带到Django的最佳方法?

我已经对Celery进行了一些调查,但我认为因为我还是Django的初学者,所以我对一些文档感到困惑。例如:即使任务是异步发送给工作人员,浏览器如何获取程序的当前状态?此外,Django上的芹菜似乎缺乏一致的文档(我看到人们在他们的Django项目中以不同的方式设置芹菜)。

我很感激这里的任何意见,我已经坚持了一段时间了。

1 个答案:

答案 0 :(得分:1)

我的第一个建议是,当你开始想起芹菜时,从心理上将芹菜与django分开。它们可以在相同的环境中运行,但芹菜是异步处理django对http请求的作用。

还要记住,芹菜与diango不同,因为它需要其他服务来运作;消息代理。因此,通过使用芹菜,您将增加您的建筑要求。

为解决您的特定用例,您需要一个系统将消息从每个芹菜任务发布到消息代理,您的Web客户端将需要订阅这些消息。

这里涉及很多,但简短的版本是您可以使用Redis作为您的芹菜消息代理以及您的pub / sub服务来将消息发送回浏览器。然后,您可以使用例如diango-redis-websockets将浏览器订阅到redis中的任务状态消息