我正在编写一个需要并发和异步性的Python应用程序。我已经为Twisted和Celery提出了一些建议,但是我无法确定哪个是这个应用程序的更好选择(我没有经验)。
应用程序(不是Web应用程序)主要围绕向各种第三方API发出SOAP调用。要处理给定的数据,我需要按顺序调用几个API。而且我希望能够为每个API提供一个“工作者”池,这样我就可以一次为每个API拨打多个电话。没有什么关于这个应该是非常密集的。
更具体地说,外部进程将向该应用程序的数据库添加新的“消息”。我需要一份监视新消息的工作,然后将它们推送到Process。该过程将包含4-5个步骤,这些步骤需要按顺序发生,但可以完全异步发生。每个步骤都将接收消息并以某种方式对其进行操作,通常会向消息添加详细信息。每个后续步骤都需要从其前面的步骤输出。对于大多数这些步骤,所涉及的工作主要围绕通常使用SOAP客户端调用第三方API,解析响应以及更新消息。一些案例将涉及创建二进制文件(如果这是一个因素,则更难腌制)。最后,一旦最后一步完成,我将需要更新数据库中的一个标志,以指示整个过程已完成此消息。
此外,由于每个步骤都涉及等待网络响应,因此我希望通过在每一步同时发出多个请求来提高整体吞吐量。
Celery或Twisted在这里是一个更普遍合适的框架吗?如果他们都能充分解决问题,那么使用一个与另一个是否有利有弊?还有什么我应该考虑的吗?
答案 0 :(得分:16)
Celery或Twisted在这里是一个更普遍合适的框架吗?
取决于“通常合适”的含义。
如果他们都能充分解决问题,那么使用其中一种与另一种相比是否有利弊?
不是详尽的清单。
芹菜优点:
芹菜缺点:
Twisted Pros:
扭曲的缺点:
我对两者都很熟悉,而且从你说的话来看,如果是我,我会选择Twisted。
我会说你会使用Celery更快地完成它,但是你可以通过使用Twisted来学习更多。 如果您有时间和倾向于遵循陡峭的学习曲线,我建议您在Twisted中执行此操作。
答案 1 :(得分:1)
Celery允许您使用各种异步库的异步行为,如gevent和eventlet。所以你可以两全其美。
使用eventlet的示例 https://github.com/celery/celery/tree/master/examples/eventlet
使用gevent的示例 https://github.com/celery/celery/tree/master/examples/gevent