【问题标题】:Celery task always PENDING芹菜任务总是待处理
【发布时间】:2020-11-28 03:55:13
【问题描述】:

我尝试在带有 redis 后端的 Windows 上运行 Celery 示例。代码如下:

from celery import Celery

app = Celery('risktools.distributed.celery_tasks',
             backend='redis://localhost',
             broker='redis://localhost')

@app.task(ignore_result=False)
def add(x, y):
    return x + y

@app.task(ignore_result=False)
def add_2(x, y):
    return x + y

我使用 iPython 控制台启动任务:

>>> result_1 = add.delay(1, 2)    
>>> result_1.state
'PENDING'
>>> result_2 = add_2.delay(2, 3)    
>>> result_2.state
'PENDING'

似乎这两个任务都没有执行,但是 Celery worker 输出显示他们成功了:

[2014-12-08 15:00:09,262: INFO/MainProcess] Received task: risktools.distributed.celery_tasks.add[01dedca1-2db2-48df-a4d6-2f06fe285e45]
[2014-12-08 15:00:09,267: INFO/MainProcess] Task celery_tasks.add[01dedca1-2db2-48df-a4d6-2f06fe28
5e45] succeeded in 0.0019998550415s: 3
[2014-12-08 15:00:24,219: INFO/MainProcess] Received task: risktools.distributed.celery_tasks.add[cb5505ce-cf93-4f5e-aebb-9b2d98a11320]
[2014-12-08 15:00:24,230: INFO/MainProcess] Task celery_tasks.add[cb5505ce-cf93-4f5e-aebb-9b2d98a1
1320] succeeded in 0.010999917984s: 5

我已尝试根据Celery documentation 解决此问题,但没有任何建议有用。我做错了什么,如何从 Celery 任务中接收结果?

统一更新: 我添加了一个没有ignore_result 参数的任务,但没有任何改变

@app.task
def add_3(x, y):
    return x + y

>>>r = add_3.delay(2, 2)
>>>r.state
'PENDING'

【问题讨论】:

标签: python windows redis celery


【解决方案1】:

根据Celery 'Getting Started' not able to retrieve results; always pendinghttps://github.com/celery/celery/issues/2146 这是一个Windows 问题。 Celery --pool=solo 选项解决了这个问题。

【讨论】:

  • Mac 也遇到这个问题,谢谢提示
【解决方案2】:

在 Windows 上尝试-P threads,而不是Celery --pool=solo 选项。

【讨论】:

  • 这听起来像是评论,而不是答案。
【解决方案3】:

设置CELERY_TASK_TRACK_STARTED = True(或在个别任务上设置 track_started=True)也有帮助 - 这将启用 STARTED 状态。

【讨论】:

    【解决方案4】:

    从 celery 文档中删除 ignore_result=False

    Task.ignore_result
    
    Don’t store task state. Note that this means you can’t 
    use AsyncResult to check if the task is ready, or get its return value.
    

    【讨论】:

    • 我仍然得到PENDING 状态(参见UPD 中的add_3 方法)
    【解决方案5】:

    谢谢大家。

    我的芹菜配置:

    -------------- celery@DESKTOP-FD38GOO v4.4.2 (cliffs)
    --- ***** -----
    -- ******* ---- Windows-10-10.0.18362-SP0 2020-04-17 06:58:18
    - *** --- * ---
    - ** ---------- [config]
    - ** ---------- .> app:         mysite:0x25cfd40d208
    - ** ---------- .> transport:   redis://localhost:6379//
    - ** ---------- .> results:     redis://localhost:6379/1
    - *** --- * --- .> concurrency: 8 (thread)
    -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
    --- ***** -----
     -------------- [queues]
                    .> celery           exchange=celery(direct) key=celery
    
    
    [tasks]
      . mysite.celery.debug_task
      . supplier.tasks.add
      . supplier.tasks.count_widgets
      . supplier.tasks.count_widgets2
      . supplier.tasks.mul
      . supplier.tasks.xsum
    

    我已经解决了这个问题:

    我等待此类问题大约 1 天,并尝试卸载 redis 并在 windows 10 上安装 redis。

    最后我发现没有并发配置。

    第一个解决方案:

    celery -A mysite worker -l info -P 线程

    第二种解决方案:

    celery -A mysite worker -l info --pool=solo

    我的芹菜配置:

    CELERY_BROKER_URL = 'redis://localhost:6379'
    CELERY_RESULT_BACKEND = 'redis://localhost:6379/1'
    CELERY_ACCEPT_CONTENT = ['application/json']
    CELERY_RESULT_SERIALIZER = 'json'
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_IGNORE_RESULT = False
    CELERY_TIMEZONE = TIME_ZONE
    CELERY_TRACK_STARTED = True
    CELERYD_LOG_FILE = os.path.join(
        BASE_DIR, 'celery', 'logs')   
    CELERYD_LOG_LEVEL = "INFO"
    

    【讨论】:

      猜你喜欢
      • 2014-10-02
      • 2014-05-29
      • 2014-07-31
      • 2018-02-28
      • 2015-04-01
      • 2020-07-09
      • 2018-04-23
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多