python
  • celery
  • 2014-01-26 43 views 8 likes 
    8

    我正在重構我的代碼以使用芹菜工人。芹菜工作人員和命令行參數

    之前我曾經使用argparse來傳遞命令行參數。

    例如

    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模塊,不​​。

    看到文檔本節更多:

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

    +2

    我明白如何將參數傳入bootstep __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) 
    

    然後在文件牽着你的任務補充一點:

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

    我試圖解決它的時候是在模塊導入使API_SERVER模塊全局變量但它不起作用,因爲它爲時尚早。由於我的任務非常緊張,因此運行這麼多次並不會造成任何負面影響。

    +0

    您可以使用'bootsteps.StartStopStep'類作爲基礎。通過這種方式,您可以更早地獲取值(並將其保存在變量或其他內容中),甚至可以在工作人員啓動時驗證參數的值。 – tsionyx

    +0

    「on celery.py add:」原諒我 - 但你不應該碰撞芹菜的命名空間。選擇'celery.py'肯定會打破多模塊應用程序。 –

    相關問題