gra*_*hey 8 python amazon-ec2 amazon-web-services celery amazon-elastic-beanstalk
我收到了但不会执行的Celery任务.我使用的是Python 2.7和Celery 4.0.2.我的消息代理是Amazon SQS.
这输出celery worker:
$ 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]
Run Code Online (Sandbox Code Playgroud)
我-Ofair在运行时尝试添加,celery worker但没有帮助.其他一些可能有用的信息:
ps aux.请注意,它在3个不同的进程中运行芹菜(不知道为什么),其中一个具有99.6%的CPU利用率,即使它没有完成任何任务或任何事情.流程:
$ 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
Run Code Online (Sandbox Code Playgroud)
设置:
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
Run Code Online (Sandbox Code Playgroud)
报告:
$ 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
Run Code Online (Sandbox Code Playgroud)
Iba*_*hah 30
首先安装eventlet,
> pip install eventlet
Run Code Online (Sandbox Code Playgroud)
然后运行
> celery -A myapp.celeryapp worker --loglevel=info -P eventlet
Run Code Online (Sandbox Code Playgroud)
Muk*_*rma 15
我认为您正在 Windows 中运行 celery,请尝试在 cmd 中添加以下参数:
-P solo
Run Code Online (Sandbox Code Playgroud)
所以新参数将如下:
-A main worker --loglevel=info --queues=your_queue_name -P solo
Run Code Online (Sandbox Code Playgroud)
我也遇到了同样的问题。经过一点搜索,我找到了添加--without-gossip --without-mingle --without-heartbeat -Ofair到 Celery worker 命令行的解决方案。所以在你的情况下你的工人命令应该是
celery worker -A myapp.celeryapp --loglevel=INFO --without-gossip --without-mingle --without-heartbeat -Ofair
在 Celery 3.1 上,禁用工人闲聊 ( --without-gossip) 足以解决这个问题。看起来一个错误导致此工作人员间通信在CELERY_ACKS_LATE启用时挂起。任务确实已收到,但从未被确认或执行。停止工作线程会将它们返回到队列中。
来自八卦文档:
这意味着工作人员知道其他工作人员在做什么,并且可以检测他们是否离线。目前,这仅用于时钟同步,但未来添加的可能性有很多,您可以编写已经利用这一点的扩展。
因此,您很可能根本就没有使用此功能,而且它还增加了经纪商的负担。
没有时间进行调查,但最好使用最新的 Celery 进行测试,并在问题仍然发生时提出问题。即使这种行为是预期的/不可避免的,也应该记录下来。
| 归档时间: |
|
| 查看次数: |
3024 次 |
| 最近记录: |