芹菜工人和命令行args

时间:2014-01-26 15:15:08

标签: python celery

我正在重构我的代码以使用芹菜工人。

之前我曾经使用argparse传递命令行参数。

e.g。

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

3 个答案:

答案 0 :(得分:9)

Celery工作人员未执行您的__main__

如果要添加其他命令行选项,可以使用app.user_options, 但请注意,它使用的是optparse模块,而不是argparse

请参阅文档中的此部分了解更多信息:

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

答案 1 :(得分: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成为模块全局变量但是因为它太早而无法正常工作。由于我的任务非常密集,因此多次运行并没有坏处。

答案 2 :(得分:0)

可以使用辅助选项。

例如,我必须在任务之一中初始化mongo数据库

from celery import bootsteps
from celery.bin import Option
import mongoConfig
.....


app = Celery('scraper')

app.user_options['worker'].add(
    Option('--mongo', dest='is_mongo_required', default=None, help='Mongo Required')
)

class CustomArgs(bootsteps.Step):

    def __init__(self, worker, is_mongo_required=None, **options):
        # store the api authentication
        if is_mongo_required is not None and is_mongo_required[0] == "true":
            print("Mongo initialization required")
            mongoConfig.init(required=True)


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


app.config_from_object('celeryConfig')

要执行的命令

celery worker -A scraper --concurrency=4 --loglevel=info -Q abc,bcd --mongo=true