2013-03-31 2 views
3

:예약 된 작업을 축적하여 작업자를 교착 상태로 만들 수 있습니까? 코드

@celery.task() 
def some_recursive_task(): 
    # Do some stuff and schedule it to run again later 
    # Note that the next run is not scheduled in a fixed basis, like crontabs 
    # but based on history of some object 
    # Actual task is found here: 
    # https://github.com/rafaelsierra/cheddar/blob/master/src/feeds/tasks.py#L39 
    # Then it call himself again 
    countdown = bla.get_countdown() 
    some_recursive_task.apply_async(countdown=countdown) 

이 작업은 다음 십분 12 시간 withing에 실행되지만이 작업도 지금 실행해야 다른 작업을 호출 one for downloading 물건과 to parse it 다른.

문제는 주 기능이 데이터베이스의 모든 단일 레코드에 대해 호출된다는 것입니다. 몇백 개의 작업이 실행 중이라고 가정 해 봅시다. 그러나 이러한 작업이 몇 시간마다 평균적으로 실행되는 것을 고려하면 작업량은별로 중요하지 않습니다.

단일 작업자와 함께이 작업을 실행하려고하면 문제가 발생합니다. 작업자를 시작하면 모든 대기열을 실행하고 동시 작업자 8 명을 설정 한 다음 작업을 인식하기 시작합니다. 어느 정도 미래에 작업이 설정 되더라도 작업자는 작업을 가져 와서 예정된 실행을 기다릴 것이므로이 작업자는 그때까지 잠겨 있습니다.

두 개의 다른 기능을 다른 대기열로 분할 할 수 있다는 것을 알고 있습니다. 이미 수행 한 작업이지만 근무자가 12 시간 후에 작업을 인식하고 30 분 내에 실행해야하는 작업을 실행하지 않을 것이라는 우려가 있습니다.

작업자가 예정된 작업을 해당 시간까지 무시하고 시간없이 지연된 작업을 실행해야합니까?

나는 어떻게 생각하지 않거나, 모른다, periodic tasks 해결책이다.

답변

2

포인트를 참조하십시오. 5 . countdowneta 작업 인수와 다르지 않습니다.

즉 당신이 옳습니다. 단일 근로자 (또는 모든 근로자)는 (eta 또는 countdown) 개의 작업을 차단해서는 안됩니다.

근로자가 잠겨 있음을 어떻게 알 수 있습니까? 예약 된 작업은 대기열에서 프리 페치되지만 실행될 때까지 확인 응답되지 않습니다.

예약 된 작업은 실행될 때까지 RAM에 보관됩니다. 당신은 그들이 가능한 한 가벼워 지길 원합니다. 내가 알기로 작업은 큰 덩어리의 데이터를 전달하지 않으며 아마도 일 뿐이므로 문제가되지 않습니다.

붙여 넣은 링크가 404를 반환합니다. cheddar은 (는) 비공개 리포지토리입니까?

+0

내 작업 흐름을 변경하고 특정 대기열을 생성 했으므로 그 이후로 계속 실행 중입니다. 나는 eta == 카운트 다운에 대해 안다. 단지 카운트 다운을 사용한다. –