2017-01-10 47 views
0

我使用celery 4RabbitMQ作为代理。我有限制Queue(大小== 200)。我的主要代码如下:当代理队列已满时,Python Celery task.delay()

for i in range(200): 
    tasks.delay(i) 

它的工作原理,如果我的范围< =大小。如果我把这样的事情:

for i in range(2000): 
    tasks.delay(i) 

和大小限制是200,Queue就会充实和任务的其余部分将被跳过。

任何人都可以请解释如何处理这种情况?我需要等到Queue将免费和insert另一个任务。

谢谢

回答

1

这是一个RabbitMQ行为。 RabbitMQ docs

一旦达到限制,消息将从队列的前端丢弃或死锁,以为新消息腾出空间。

您可以通过修改配置在RabbitMQ中管理此项,也可以使用多个队列。 解决此问题的另一种方法是使用celery's apply_async,它可以让您设置重试值eta或retry_policy。顺便说一句,delay()只是apply_async()的一个快捷方式。

+0

完美的感谢,如果我使用redis我会有同样的问题?我只是期望,这个延迟会等到队列被释放。 – wilima

+0

我认为与Redis有些不同。由于Redis只是一个关键/值数据库,它并不像RabbitMQ那样拥有队列的概念。这意味着在Redis中没有队列限制,但在Reids中有一个限制,即为Redis分配多少内存和/或磁盘空间。 这就是为什么芹菜非常擅长缩放它,所以如果需要可以添加更多的工人。希望这有助于 – xirdneh

+0

@wilima,顺便说一句。如果答案确实帮助你。你能把它标记为正确的答案吗?谢谢。 – xirdneh