我的建议是你使用钩针,但也许对你最有用的是解释使用钩针和芹菜之间的区别。
Celery 是一个分布式任务队列。这将允许您通过将某些状态持久化到外部队列中来解除对 Web 请求的阻塞(使用 Celery 时需要做的第一件事是选择持久性机制),然后在需要时从消费者那里检索该自动状态执行工作。
Twisted(通过钩针)是一个带有事件驱动 I/O的事件循环。您不需要保留任何外部状态:您只需将工作从 Django(web-request-handling)线程扔到 Twisted(event-loop-work-handling)线程。
使用 Celery,您需要将作业序列化到外部系统,以及配置、监控和运行消息队列服务。因为 Celery 默认使用 Pickle 来序列化它的工作,所以它会神奇地工作,直到你不小心拉入千兆字节的状态,或者你升级你的应用程序并开始获得随机回溯。(不要使用pickle, 不要使用pickle, 不要使用pickle。)您还可以选择JSON 作为您的序列化机制,这不会那么令人惊讶,但会涉及更多手动准备后台处理中涉及的对象.
使用 Twisted,您可以将您的工作扔给同一个进程执行,共享任何有意义的对象(尽管希望小心避免同时从您的 Django 请求和您的 Twisted 线程访问它们)。没有任何额外的监控、管理或配置;一切都发生在你的 Python 进程中。
基本上,Celery 方法工作量更大,但也有额外的优势。通过将所有工作序列化为外部状态,您可以使您的工作人员对崩溃具有弹性,因此当您的 Django 请求完成时,您知道最终会有人处理该工作。您选择的排队系统可能具有管理背压、负载峰值和其他功能的功能,这些功能可能为您的后台工作提供有用的控制平面。
另一方面,使用钩针编织几乎是免费的。除了安装 Twisted 外,它不会施加任何额外的操作限制,没有可能导致系统部分故障的移动部件(您的消息队列系统无法关闭,因为没有这样的系统,您只是在打电话一些功能)。它还可以让您保留可能难以序列化的对象,例如与传出系统的连接,或您不想在排队系统中以纯文本形式存储的凭据。但是,如果您需要任何工具来监控和管理从 Web 前端到任务运行后端的工作,您需要自己实现它。