2014-04-05 5 views
4

온라인 게임에 장고와 함께 셀러리를 사용하고 있습니다. 나는 셀러리이 답변에 따라 사용할 수 및 실행 여부를 확인하기 위해 미들웨어를 작성했습니다셀러리 사용 가능 여부 확인

: Detect whether Celery is Available/Running

내 코드는 실제로 다음과 같습니다

from celery.task.control import inspect 

class CeleryCheckMiddleware(object): 

    def process_request(self, request): 
     insp = inspect().stats() 
     if not insp: 
      return render(...) 
     else: 
      return None 

하지만 주석에주의를 잊었다 그 대답의 맨 아래에, 위의 내용이 실행될 때마다 위의 두 개의 reply.celery.pidbox 대기열이 rabbitmq에 추가된다는 것을 발견했습니다. 이로 인해 rabbitmq의 메모리 사용이 점차 증가하게되었습니다. '

저는줄에서 시작하여 OSError: [Errno 4] Interrupted system call으로 끝나는 500 개의 오류가 있음을 알게되었습니다 (하루 후 만!).

셀러리가 사용 가능하고 실행 중인지 확인하는 메모리 안전 방법이 있습니까?

+0

이 해결책이 있습니까? 이전 호출에서 사용한 메모리를 플러시 할 수 있습니까? –

+0

@TimTisDall은 내가 찾은 것이 아닙니다. 나는 새 작업을 받아 들일 수 없도록 업데이트하는 동안 사이트를 유지 관리 모드로 전환하는 데 주력했습니다. – heidi

+0

아마도 중간 영역이 작동 할 것입니다 ... 미들웨어는 업데이트를 수행 할 때만 검사를 수행하고 그렇지 않으면 검사를 중지하십시오. 그러나'celery'가 중단 될 때 제어하는 ​​사람이라면 유지 관리 화면을 수동으로 올려 놓는 것이 더 중요합니다. –

답변

1

매우 무겁습니다. 비동기 작업을 실행하고 허용 가능한 시간 초과로 결과를 수집하는 것이 좋습니다. 순진한 생각이지만 리소스를 얼마나 자주 호출해야하는지에 따라 많은 영향을 미치지 않습니다 .....

@app.job 
def celery_alive(): 
    return "OK" 

def process_request(self, request): 
    res = celery_alive.apply_async() 
    try: 
     return "OK" == res.get(timeout=settings.ACCEPTABLE_TRANSACTION_TIME) 
    except TimeoutError as e: 
     return False 
+0

답장을 보내 주셔서 감사합니다.하지만 모든 요청에 ​​대해 확인해야합니다. 어느 쪽이든, 이제는 여러 가지 업데이트를하는 동안 사이트를 유지 관리 모드로 전환하는 것에 찬성하여 전체 아이디어를 포기했습니다. – heidi

+0

작업자가 오프라인 일 때 job.apply()를 기본값으로 설정합니까? –

+0

아니요, 전체 사이트의 유지 관리 페이지를 표시하고 있습니다. – heidi

관련 문제