2017-01-10 1 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.

한도에 도달하면 메시지가 대기열 앞면에서 떨어지거나 새 메시지를위한 여유 공간을 만듭니다.

config를 수정하여 RabbitMQ에서 관리하거나 여러 대기열을 사용할 수 있습니다. 이 문제를 해결하는 또 다른 방법은 재시도 값, eta 또는 retry_policy를 설정할 수있는 celery's apply_async을 사용하는 것입니다. BTW, delay() 바로 apply_async() 지름길입니다.

+0

완벽하게 고맙습니다. 내가 redis를 사용하면 동일한 문제가 발생합니까? 지연이 대기열이 무료가 될 때까지 대기 할 것입니다. – wilima

+0

레디 스는 조금 다르다고 생각합니다. Redis는 키/값 데이터베이스 일 뿐이므로 RabbitMQ와 같은 대기열 개념을 실제로 가지고 있지 않습니다. 즉, Redis에는 대기열 제한이 없지만 Redis에 할당하는 메모리 및/또는 디스크 공간의 양은 Reids에 제한이 있습니다. 셀러리가 확장 성이 뛰어나 필요에 따라 더 많은 작업자를 추가 할 수있는 이유입니다. 희망이 도움이 – xirdneh

+0

@wilima, btw. 대답이 도움이된다면. 올바른 답으로 표시 할 수 있습니까? 감사. – xirdneh

관련 문제