Python RabbitMQ:芹菜提供了什么,而皮卡没有';T

Python RabbitMQ:芹菜提供了什么,而皮卡没有';T,python,rabbitmq,celery,task-queue,pika,Python,Rabbitmq,Celery,Task Queue,Pika,我一直在努力通过RabbitMQ实现一些分布式任务 我花了一些时间试着让芹菜做我想做的事,但没能让它起作用 然后我试着用皮卡,结果一切顺利,几分钟内就完成了 用鼠兔肉代替芹菜,我有什么遗漏吗?鼠兔肉提供的只是芹菜的一小部分功能。Pika是用于与RabbitMQ交互的Python库。RabbitMQ是一个消息代理;它的核心是向队列发送消息或从队列接收消息。它可以用作任务队列,但也可以仅用于在进程之间传递消息,而不实际分发“工作” 芹菜实现了一个分布式任务队列,可以选择使用RabbitMQ作为IPC

我一直在努力通过RabbitMQ实现一些分布式任务

我花了一些时间试着让芹菜做我想做的事,但没能让它起作用

然后我试着用皮卡,结果一切顺利,几分钟内就完成了


用鼠兔肉代替芹菜,我有什么遗漏吗?

鼠兔肉提供的只是芹菜的一小部分功能。Pika是用于与RabbitMQ交互的Python库。RabbitMQ是一个消息代理;它的核心是向队列发送消息或从队列接收消息。它可以用作任务队列,但也可以仅用于在进程之间传递消息,而不实际分发“工作”

芹菜实现了一个分布式任务队列,可以选择使用RabbitMQ作为IPC的代理。它不仅提供了一种在进程之间发送消息的方式,还提供了一种在进程之间分配实际任务/作业的系统。以下是芹菜网站的描述:

任务队列用作跨线程分配工作的机制 或机器

任务队列的输入是一个工作单元,称为任务,专用 然后,工作进程会不断监视队列,以获取新的工作 表演

芹菜通过消息进行通信,通常使用代理进行调解 在客户和员工之间。要启动任务,客户端将 消息,然后代理将消息传递给 工人

芹菜系统可以由多个工人和经纪人组成,提供 实现高可用性和水平扩展的途径

芹菜有一整套内置功能,这超出了pika的范围。您可以查看以了解它可以做的事情,但以下是一个示例:

>>> 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在
范围(0100)
中,y在
范围(0100)
中。它通过将一个名为
add
的任务(添加两个数字)分成10块,并将添加
1+1
2+2
3+3
等的工作分配给尽可能多的芹菜工人来完成。每个工作人员将在其10个项目块上运行
add
,直到所有工作完成。然后通过
res.get()
调用收集结果。我相信你可以想象一种使用皮卡的方法,但我相信你也可以想象需要做多少工作。你可以用芹菜从盒子里拿出来


如果您愿意,您当然可以使用pika来实现分布式任务队列,特别是如果您有一个相当简单的用例。芹菜只是为任务调度、管理等提供了一个“含电池”的解决方案。如果您决定在pika解决方案中使用芹菜,那么您必须手动实现它。

我将在这里添加一个答案,因为这是今天第二次有人根据我怀疑的答案在不需要时推荐芹菜。因此,分布式任务队列和代理之间的区别在于代理只是传递消息。不多不少。Cellery建议使用RabbitMQ作为IPC的默认代理,并将其置于适配器之上,以使用守护进程管理任务/队列。而这对于分布式任务尤其有用,因为在分布式任务中,您需要非常快的通用性。它只是为发布者/消费者流程构建的。实际任务如果您已经定义了需要逐步执行的工作流,并根据您的特定需求确保消息的持久性,那么您最好编写自己的发布者/消费者,而不是依赖芹菜。显然,您仍然需要进行所有的耐久性检查等。对于大多数与web相关的服务,您并不控制实际的“工作”单元,而是将它们传递给服务。因此,除非您达到基于ip/地理区域或帐号的任意API调用限制,否则对于分布式任务队列来说没有什么意义。。。或者类似的东西。因此,使用芹菜不会阻止您编写或处理状态代码或工作流管理等,它以一种让您轻松避免编写发布者/消费者代码结构的方式公开了AMQP


因此,简而言之,如果您需要一个简单的任务队列来仔细检查工作,而您并不真正关心性能的细微差别、工作流或实际发布/消费过程中的复杂性。芹菜有用。如果您只是将消息传递给一个您实际上无法控制的api或服务,当然,您可以使用芹菜,但您也可以在几分钟内用Pika轻松激发您自己的出版商/消费者。如果您需要健壮的或符合您自己的耐用性场景的东西,请像其他人一样编写您自己的发布/消费代码。

您尝试做了哪些无法投入工作的事情?你能给我们看一下代码或者描述一下你试图使用的分布式算法吗?