Celery搭配Redis后端时AsyncResult获取结果异常挂起问题
问题分析与解决方法
嘿,这个问题我遇过!原因其实很简单:你直接创建的AsyncResult实例没有配置正确的Redis后端信息,导致它不知道该去哪里读取任务结果,所以一直挂起等待。
你看,当你用add.delay(1,1)得到的r对象,它是从你的Celery任务实例继承了已配置好的Redis后端(就是你看到的r.backend那个RedisBackend对象),所以能正常获取结果。但当你用AsyncResult(r.id)新建一个对象时,这个x并没有自动继承你的Celery应用的配置,它可能用了默认的后端(比如RPC后端),根本连不上你的Redis存储,自然就卡着不动了。
解决办法有两种:
方法一:从你的Celery应用实例中生成AsyncResult
假设你的Celery应用是在test_celery模块里定义的(比如叫app),你可以这样做:>>> from test_celery import app >>> from celery.result import AsyncResult >>> x = app.AsyncResult(r.id) >>> x.get() # 现在就能正常拿到结果2了这样创建的
AsyncResult会自动使用你Celery app里配置好的Redis后端和消息队列信息。方法二:手动指定后端参数
如果你不想导入Celery app,也可以在创建AsyncResult时直接指定Redis后端的地址:>>> x = AsyncResult(r.id, backend='redis://localhost:6379/0') # 替换成你的Redis实际地址 >>> x.get()
你可以试试上面两种方法,应该就能解决挂起的问题啦~
内容的提问来源于stack exchange,提问作者seb835
相关产品推荐
相关产品推荐

