django celery 回调问题请教

2017-12-20 13:30:45 +08:00
 fanne

有个执行shell脚本的函数,因为执行时间比较长,大概 5 分钟左右,所以我用了 celery 做异步处理,不然页面一直卡着在加载情况。

task_work.py文件

@celery_app.task
def ssh_key(host,shell,action_info):
	#执行脚本的一些操作

views.py文件里面调用这个任务

from task_work import ssh_key
abc = ssh_key.delay(info.public_ip,cmd,action_info)

好了,问题来了。 这个异步任务可以正常丢后台运行,那么我现在要获得这个异步任务的结果要怎么处理?

我试过以下一些方式,但都不行。

按照官方做法,可以通过

abc.result 获得结果
但这个的前提是
abc.state == 'SUCCESS'才行

所以我处理方式

from task_work import ssh_key
abc = ssh_key.delay(info.public_ip,cmd,action_info)
while abc.state != 'SUCCESS':
	time.sleep(1)
print abc.result

这么处理结果,把异步的又转为同步的

后来想着把time.sleep()也丢到一个新的异步任务中,处理方式如下

task_work.py文件新增一个任务

@celery_app.task
def result_state(task_id):
	print task_id
	print AsyncResult(task_id).state
    ##后面接 time.sleep()等一些操作

views.py文件里面也新增一个调用

abc = ssh_key.delay(info.public_ip,cmd,action_info)
print abc.id

result_state.delay(abc.id)

然而也并不行,报以下错误信息:

如果直接在views.py里面打印 id,state 是有值

abc = ssh_key.delay(info.public_ip,cmd,action_info)
print abc.id
print type(abc.id)

from celery.result import AsyncResult
print AsyncResult(abc.id).ready()
print AsyncResult(abc.id).state

各位大神,这是为何呢

4944 次点击
所在节点    Django
4 条回复
GurdZain
2017-12-20 13:48:46 +08:00
zhanghb
2017-12-20 15:35:03 +08:00
我之前做过一个项目是把获取到的 id, 直接放 context 里面 return 到 template 里面。然后页面上的 js 每隔几秒钟 ajax 的方式问一下后端的 view 看看 state 是否已经 success 了。

不过也没去尝试过其他的办法,不知道有没有更方便友好的。
fanne
2017-12-20 16:13:03 +08:00
@GurdZain @zhanghb
celery 4.0 之后可以用下列方式,刚刚试了,有返回了

```
# tasks.py
class MyTask(Task):
def on_success(self, retval, task_id, args, kwargs):
print 'task done: {0}'.format(retval)
return super(MyTask, self).on_success(retval, task_id, args, kwargs)
def on_failure(self, exc, task_id, args, kwargs, einfo):
print 'task fail, reason: {0}'.format(exc)
return super(MyTask, self).on_failure(exc, task_id, args, kwargs, einfo)

@app.task(base=MyTask)
def add(x, y):
return x + y
```
cszhiyue
2017-12-21 11:17:52 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/416245

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX