pika 提供的只是 Celery 所做的一小部分。 Pika 是用于与 RabbitMQ 交互的 Python 库。 RabbitMQ 是一个消息代理;在其核心,它只是向队列发送消息/从队列接收消息。它可以用作任务队列,但也可以仅用于在进程之间传递消息,而无需实际分配“工作”。
Celery 实现了一个分布式任务队列,可选择使用 RabbitMQ 作为 IPC 的代理。它不仅仅是提供一种在进程之间发送消息的方式,它还提供了一个在进程之间分配实际任务/作业的系统。以下是 Celery 网站的描述:
任务队列用作跨线程分配工作的机制
或机器。
任务队列的输入是一个工作单元,称为任务,专用
然后工作进程不断监视队列中的新工作以
执行。
Celery 通过消息进行通信,通常使用代理进行调解
客户和工人之间。为了启动一个任务,客户端放置一个
队列中的消息,然后代理将消息传递给
工人。
一个 Celery 系统可以由多个工人和经纪人组成,给
实现高可用性和水平扩展的方法。
Celery 内置了一大堆超出 pika 范围的功能。您可以查看Celery docs 以了解它可以做什么,但这里有一个示例:
>>> from proj.tasks import add
>>> res = add.chunks(zip(range(100), range(100)), 10)()
>>> res.get()
[[0, 2, 4, 6, 8, 10, 12, 14, 16, 18],
[20, 22, 24, 26, 28, 30, 32, 34, 36, 38],
[40, 42, 44, 46, 48, 50, 52, 54, 56, 58],
[60, 62, 64, 66, 68, 70, 72, 74, 76, 78],
[80, 82, 84, 86, 88, 90, 92, 94, 96, 98],
[100, 102, 104, 106, 108, 110, 112, 114, 116, 118],
[120, 122, 124, 126, 128, 130, 132, 134, 136, 138],
[140, 142, 144, 146, 148, 150, 152, 154, 156, 158],
[160, 162, 164, 166, 168, 170, 172, 174, 176, 178],
[180, 182, 184, 186, 188, 190, 192, 194, 196, 198]]
这段代码想要添加每个 x+y,其中 x 在 range(0, 100) 中,y 在 range(0,100) 中。它通过执行名为add 的任务来实现这一点,该任务将两个数字相加,并将添加1+1、2+2、3+3 等的工作分配到 10 个块中,并将每个块分配给尽可能多的 Celery有可用的工人。每个工作人员将在其 10 个项目块上运行 add,直到所有工作完成。然后通过res.get() 调用收集结果。我相信您可以想象一种使用 pika 的方法,但我相信您也可以想象需要做多少工作。您可以使用 Celery 开箱即用地获得该功能。
如果您愿意,当然可以使用 pika 来实现分布式任务队列,特别是如果您有一个相当简单的用例。 Celery 只是为任务调度、管理等提供“包含电池”的解决方案,如果您决定将它们与您的 pika 解决方案一起使用,则必须手动实施。