2014-01-26 3 views
8

셀러리 작업자를 사용하도록 코드를 리팩토링하고 있습니다.셀러리 작업자 및 명령 줄 args

이전에는 argparse를 사용하여 명령 줄 args를 전달했습니다.

if __name__ == "__main__": 
    parser = argparse.ArgumentParser(description='Node') 
    parser.add_argument('--environment', action="store", default='local', help="env e.g. production of development") 
    environment = arg_options.environment 

하지만이 오류가 발생합니다.

celery -A tasks worker --loglevel=info --environment local 
celery: error: no such option: --environment 

어떻게 추가 할 수 있습니까?

환경 변수를 사용하고 싶지는 않습니다.

e.g export environment=development 

답변

9

셀러리 작업자가 __main__을 실행하지 않습니다.

추가 명령 줄 옵션을 추가 할 경우 app.user_options, 를 사용하지만 그것은 optparse 모듈하지 argparse를 사용하는 점에 유의 할 수 있습니다.

더의 문서에서이 섹션을 참조하십시오 : 소스 코드를보고

http://docs.celeryproject.org/en/latest/userguide/extending.html#preload-options

+2

나는 부트 스텝 __init__ 메쏘드로 인자를 얻는 방법을 알고 있지만 어떻게하면이 매개 변수를 작업에서 접근 할 수 있을까? – cacois

+1

또는 그들을 얻는 방법 ... 모든 솔직히. 시간이 없어졌다. – chuckjones242

5

, 나는이 문제를 해결할 수있는 방법을 알아 냈어요. celery.py 추가 기능에

:

from celery import bootsteps 
from celery.bin import Option 

.... 
app.user_options['worker'].add(
    Option('--server', dest='api_server', default='127.0.0.1', 
      help='API server to use.') 
) 

app.conf['API_SERVER'] = '127.0.0.1' 

class ConfigBootstep(bootsteps.Step): 
    def __init__(self, worker, api_server=None, **options): 
     app.conf['API_SERVER'] = api_server 

app.steps['worker'].add(ConfigBootstep) 

그런 다음 파일을 들고 당신의 작업이 추가 : 나는 모듈을 가져올 때 그것을 해결하여 API_SERVER에게 모듈 전역 변수를 만드는 시도

from celery import current_app 
... 
@shared_task() 
def roboscope(): 
    API_SERVER = current_app.conf.get('API_SERVER', '127.0.0.1') 

하지만 너무 일찍부터는 효과가 없습니다. 내 임무가 상당히 집중적이기 때문에 여러 번 실행하면 해가되지 않습니다.

+0

'bootsteps.StartStopStep' 클래스를 기반으로 사용할 수 있습니다. 이렇게하면 이전에 값을 가져올 수 있고 (변수에 저장하거나 다른 것으로 저장) 심지어 작업자가 시작할 때 인수 값을 확인할 수도 있습니다. – tsionyx

+0

"on celery.py add :"용서해주세요.하지만 샐러리의 네임 스페이스와 충돌해서는 안됩니다. 'celery.py'를 선택하면 멀티 모듈 응용 프로그램이 제대로 작동하지 않게됩니다. –

관련 문제