如何在 celery 异步 task 执行中拿到里面的返回值

2022-07-14 11:32:29 +08:00
 u2gign

各位彦祖,想在页面实时显示当前执行程序的日志,所以需要在运行程序时就获取到数据库这条记录的 id ,但执行的是 celery 异步 task ,没办法直接拿到 id ,只能等异步完成后才能拿到,这个如何解决。 (插库操作不能放到异步程序外,因为还有很多参数是在这里获取的)求彦祖能给个解决方案


@shared_task(base=mytask,bind=True)
def data_run(self,caseList,project,env,username,type=None,ids=None):
	. . .
    #插库记录
    run_record = runRecord.objects.create(user_name=username, casepath=caselists[1], env=env,uuid=task_id, cases=','.join(caselists[0]), project=project,status=1, type=0, vaild=1, report=report, log=LOG_FILE_PATH)
    #获取这条库记录 id
    id = model_to_dict(run_record)['id']
    #执行程序
    sk = runner.run(caseList=caseList,report=report,project=project,env=env,refail=refail)
2203 次点击
所在节点    Python
7 条回复
filwaline
2022-07-14 11:50:57 +08:00
如果只需要 id 的话,那就任务执行之前预分配个自定义 id 呗,然后作为参数传递给 task 。

强行 hack 一个 task 纯粹自找麻烦。
hanssx
2022-07-14 11:50:58 +08:00
插库操作返回的 id ,估计只能写到 redis 之类里面作媒介,定时去读了。
imycc
2022-07-14 12:49:13 +08:00
如果希望调用这个 task 的一方尽早地拿到 ID ,我的做法是在调用 task 之前,先创建一条初始化的记录,用个字段 state=init 表示,那些不确定的字段就赋一个初始值,然后把 id 作为参数传给 task 。
task 执行的时候,从数据库用 id 把指定记录捞出来,把状态改为 pending/running ,等执行结束再改个状态
u2gign
2022-07-14 12:53:52 +08:00
@imycc 好主意,谢谢哈
cz5424
2022-07-14 13:59:53 +08:00
xxxxx.apply_async(task_id=xxxxx)
zoofy
2022-07-14 14:00:22 +08:00
看代码感觉是用 django, 可以看下 django-celery-results
37Y37
2022-07-14 14:07:33 +08:00
这个我写过,channels 做 websocket ,celery 异步读取丢给 channels https://blog.ops-coffee.cn/s/r5spytjrl0jjeauye4q_-q

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

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

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

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

© 2021 V2EX