【问题标题】:django celery get() for getting the result form taskdjango celery get() 用于获取结果表单任务
【发布时间】:2023-03-26 09:19:01
【问题描述】:

我有一个对服务器的 API 调用,我正在使用 celery 进行一些处理。 celery 的输出被传回给客户端。

我用过

som = task_async_get_cached_session.delay('session_123')
print 'before'
result = som.get(timeout=1)
print 'after'

我看了celery -l INFO,任务成功了 succeeded in 0.024465521s: {data: {session_123: something}}

但是我的客户没有得到回复,我设置了超时,现在我收到了The operation timed out. (<class 'celery.exceptions.TimeoutError'>)

当我查看日志跟踪时,只打印了before。我的问题是,当您希望将 celery 任务生成的结果发送给客户端时,如何在没有 get() 的情况下使用 celery?

我知道get() 会将我的 API 调用转换为同步调用,但我有什么替代方法?芹菜的真正用途是什么?有没有其他方法可以将我的 API 更改为异步行为?

【问题讨论】:

    标签: python django asynchronous celery


    【解决方案1】:

    使用celery.result设计一个函数来检查任务状态并得到结果。

    from celery.result import AsyncResult
    
    def get_result(my_work):
        work = AsyncResult(my_work.id)
        if work.ready():                     # check task state: true/false
            try:
                result = work.get(timeout=1) 
                return result
            except:
                pass
    
        return "Please waiting result."
    

    【讨论】:

    • 在这种情况下,假设我通过了 {"status":"Please waiting result.", "taskId":"123"}。然后客户端在另一个 API /status/ 中使用这个 taskId 来获取结果? ..这是使服务器异步的唯一方法吗?
    • 是的,使用taskId 获取结果。您可以使用会话或数据库为每个用户存储taskId。那么用户就不需要自己记住这个id了。
    • 因为消息代理可能在远程服务器上工作。 :)
    猜你喜欢
    • 2021-02-25
    • 2015-10-28
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2019-09-25
    • 1970-01-01
    相关资源
    最近更新 更多