芹菜工人不';t从Python启动

芹菜工人不';t从Python启动,python,rabbitmq,celery,Python,Rabbitmq,Celery,我们在Ubuntu14.04上用Django、芹菜和Rabbitmq设置了Python 3.6.1。现在,我正在使用Django调试服务器(对于开发人员和Apache来说,它不起作用)。我当前的问题是芹菜工人从Python启动后立即死亡——进程显示为不存在。如果我在终端窗口中使用相同的命令,那么如果队列中有任务等待,则会创建工作进程并拾取任务 命令如下: celery worker --app=myapp --loglevel=info --concurrency=1 --maxtasksper

我们在Ubuntu14.04上用Django、芹菜和Rabbitmq设置了Python 3.6.1。现在,我正在使用Django调试服务器(对于开发人员和Apache来说,它不起作用)。我当前的问题是芹菜工人从Python启动后立即死亡——进程显示为不存在。如果我在终端窗口中使用相同的命令,那么如果队列中有任务等待,则会创建工作进程并拾取任务

命令如下:

celery worker --app=myapp --loglevel=info --concurrency=1 --maxtasksperchild=20 -n celery_1 -Q celery
无论设置哪个队列,都会出现相同的功能

在终端中,我们看到输出
myapp.settings-INFO-load…
,后面是描述队列和列出任务的输出。从Python运行时,我们最后看到的是加载…

在代码中,我们确实进行了检查,以确保没有以root身份运行芹菜命令

这些是我们
settings.py
文件中的芹菜设置:

CELERY_ACCEPT_CONTENT = ['json','pickle']
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_IMPORTS = ('api.tasks',)
CELERYD_PREFETCH_MULTIPLIER = 1
CELERYD_CONCURRENCY = 1
BROKER_POOL_LIMIT = 120  # Note: I tried this set to None but it didn't seem to make any difference
CELERYD_LOG_COLOR = False
CELERY_LOG_FORMAT = '%)asctime)s - $(processName)s - %(levelname)s - %(message)s'
CELERYD_HIJACK_ROOT_LOGGER = False
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(psconf.BASE_DIR, 'myapp_static/')
BROKER_URL = psconf.MQ_URI
CELERY_RESULT_BACKEND = 'rpc'
CELERY_RESULT_PERSISTENT = True
CELERY_ROUTES = {}
for entry in os.scandir(psconf.PLUGIN_PATH):
    if not entry.is_dir() or entry.name == '__pycache__':
        continue
    plugin_dir = entry.name
    settings_file = f'{plugin_dir}.settings'
    try:
        plugin_tasks = importlib.import_module(settings_file)
        queue_name = plugin_tasks.QUEUENAME
    except ModuleNotFoundError as e:
        logging.warning(e)
    except AttributeError:
        logging.debug(f'The plugin {plugin_dir} will use the general worker queue.')
    else:
        CELERY_ROUTES[f'{plugin_dir}.tasks.run'] = {'queue': queue_name}
        logging.debug(f'The plugin {plugin_dir} will use the {queue_name} queue.')
以下是让工人兴奋的部分:

    class CeleryWorker(BackgroundProcess):
      def __init__(self, n, q):
        self.name = n
        self.worker_queue = q        
        cmd = f'celery worker --app=myapp --loglevel=info --concurrency=1 --maxtasksperchild=20 -n {self.name" -Q {self.worker_queue}'
        super().__init__(cmd, cwd=str(psconf.BASE_DIR))

    class BackgroundProcess(subprocess.Popen):
      def __init__(self, args, **kwargs):
        super().__init__(args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, **kwargs)

任何关于如何从Python中实现这一点的建议都将不胜感激。我是Rabbitmq/Cellery的新手。

以防万一,其他人需要这个……问题是,启动整个应用程序的shell脚本现在是用sudo启动的,尽管我认为我正在检查,所以我们不会用sudo启动芹菜工人,但我错过了一些东西,我们正试图以root用户身份启动。这是一个禁忌。我现在明确地使用“sudo-u”,工人们开始正常工作了。

你提到的
芹菜工人们从Python启动,并立即死亡
。。。但我没有看到任何Python代码真正启动芹菜工人。你能把它包括进去或者更详细地描述一下吗?@sytech-我编辑了这篇文章,加入了一些代码片段,这些代码片段展示了worker是如何启动的。这个“CeleryWorker”在哪里以及如何使用的?但是不管怎样:django代码没有理由启动芹菜工人,鉴于内置开发服务器和wsgi连接器都倾向于启动和停止django子进程,您有很多理由不希望django启动芹菜工人。我们有一个管理器GUI,可以在启动时启动工人。我们获取stdout和stderr并在GUI中显示它们。在Windows10下,这一切都像一种魅力。我正试图让它在Linux中正常运行,而这正是痛苦的开始。