Python 芹菜任务已接收但未执行

Python 芹菜任务已接收但未执行,python,amazon-web-services,amazon-ec2,celery,amazon-elastic-beanstalk,Python,Amazon Web Services,Amazon Ec2,Celery,Amazon Elastic Beanstalk,我收到了芹菜任务,但不会执行。我正在使用Python 2.7和芹菜4.0.2。我的消息代理是AmazonSQS 这是芹菜工人的输出: $ celery worker -A myapp.celeryapp --loglevel=INFO [tasks] . myapp.tasks.trigger_build [2017-01-12 23:34:25,206: INFO/MainProcess] Connected to sqs://13245:**@localhost// [2017-01-

我收到了芹菜任务,但不会执行。我正在使用Python 2.7和芹菜4.0.2。我的消息代理是AmazonSQS

这是芹菜工人的输出:

$ celery worker -A myapp.celeryapp --loglevel=INFO
[tasks]
  . myapp.tasks.trigger_build

[2017-01-12 23:34:25,206: INFO/MainProcess] Connected to sqs://13245:**@localhost//
[2017-01-12 23:34:25,391: INFO/MainProcess] celery@ip-111-11-11-11 ready.
[2017-01-12 23:34:27,700: INFO/MainProcess] Received task: myapp.tasks.trigger_build[b248771c-6dd5-469d-bc53-eaf63c4f6b60]
我曾尝试在运行芹菜工人时添加空气的
-Ofair
,但没有效果。其他一些可能有用的信息:

  • 芹菜总是收到8个任务,尽管有大约100条消息等待接收
  • 大约每4到5次,一个任务实际上会运行并完成一次,但之后它会再次陷入困境
  • 这是ps aux的结果。请注意,它在3个不同的进程中运行芹菜(不知道为什么),其中一个进程的CPU利用率为99.6%,即使它没有完成任何任务或任何事情
过程:

$ ps aux | grep celery
nobody    7034 99.6  1.8 382688 74048 ?        R    05:22  18:19 python2.7 celery worker -A myapp.celeryapp --loglevel=INFO
nobody    7039  0.0  1.3 246672 55664 ?        S    05:22   0:00 python2.7 celery worker -A myapp.celeryapp --loglevel=INFO
nobody    7040  0.0  1.3 246672 55632 ?        S    05:22   0:00 python2.7 celery worker -A myapp.celeryapp --loglevel=INFO
设置:

CELERY_BROKER_URL = 'sqs://%s:%s@' % (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY.replace('/', '%2F'))
CELERY_BROKER_TRANSPORT = 'sqs'
CELERY_BROKER_TRANSPORT_OPTIONS = {
    'region': 'us-east-1',
    'visibility_timeout': 60 * 30,
    'polling_interval': 0.3,
    'queue_name_prefix': 'myapp-',
}
CELERY_BROKER_HEARTBEAT = 0
CELERY_BROKER_POOL_LIMIT = 1
CELERY_BROKER_CONNECTION_TIMEOUT = 10

CELERY_DEFAULT_QUEUE = 'myapp'
CELERY_QUEUES = (
    Queue('myapp', Exchange('default'), routing_key='default'),
)

CELERY_ALWAYS_EAGER = False
CELERY_ACKS_LATE = True
CELERY_TASK_PUBLISH_RETRY = True
CELERY_DISABLE_RATE_LIMITS = False

CELERY_IGNORE_RESULT = True
CELERY_SEND_TASK_ERROR_EMAILS = False
CELERY_TASK_RESULT_EXPIRES = 600

CELERY_RESULT_BACKEND = 'django-db'
CELERY_TIMEZONE = TIME_ZONE

CELERY_TASK_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['application/json']

CELERYD_PID_FILE = "/var/celery_%N.pid"
CELERYD_HIJACK_ROOT_LOGGER = False
CELERYD_PREFETCH_MULTIPLIER = 1
CELERYD_MAX_TASKS_PER_CHILD = 1000
报告:

$ celery report -A myapp.celeryapp

software -> celery:4.0.2 (latentcall) kombu:4.0.2 py:2.7.12
            billiard:3.5.0.2 sqs:N/A
platform -> system:Linux arch:64bit, ELF imp:CPython
loader   -> celery.loaders.app.AppLoader
settings -> transport:sqs results:django-db

我也遇到了同样的问题。经过一点搜索,我找到了一个解决方案,可以将
——没有流言蜚语——没有混杂——没有心跳——Ofair
添加到芹菜工人命令行。因此,在您的情况下,您的worker命令应该是
芹菜工人-myapp.celeryapp--loglevel=INFO--没有流言蜚语--没有交融--没有心跳--Ofair

我也有同样的问题。毗瑟奴的回答对我有用。可能还有另一种解决方案不需要将这些额外参数添加到worker命令中

我的问题是在任务代码中间导入其他模块引起的。当您启动worker时,芹菜似乎会提取所有使用过的模块,它只查看.py文件的开头。在运行期间,它不会引发任何错误,只是退出。在我将所有“导入”和“从…导入…”移到代码文件的开头之后,它就工作了。

在芹菜3.1上禁用工作人员八卦(
--没有八卦)就足以解决这个问题。当启用
CELERY\u ACKS\u LATE
时,似乎是一个bug导致此员工间通信挂起。任务确实已收到,但从未确认或执行。停止工作进程会使它们返回队列

从《流言蜚语》杂志:

这意味着一名员工知道其他员工在做什么,并且可以 检测它们是否脱机。目前这只用于时钟 同步,但有许多未来添加的可能性 您可以编写扩展来利用这一点

所以很可能你根本没有使用这个功能,而且它增加了你经纪人的负担


没有时间调查,但最好用最新的芹菜测试一下,如果问题仍然存在的话就提出问题。即使这种行为是预期的/不可避免的,也应记录在案。

首先安装eventlet


>pip安装eventlet
然后跑

芹菜-myapp.celeryapp工作者--loglevel=info-p eventlet


模块名称匹配吗?你能解释一下原因吗?@weaming我解释了我的答案中(可能)发生了什么这对我不起作用。根据这一点,我在命令中添加了
-P solo
,比如:
芹菜-A proj-worker--loglevel=INFO--concurrency 1-P solo
工作得很好!非常感谢你,伙计!独奏作为一种执行模式将起作用。。但是,它不并行执行作业,而且是单线程的。请在生产模式中注意这一点。它只是忽略了并发选项。。