
各位彦祖,想在页面实时显示当前执行程序的日志,所以需要在运行程序时就获取到数据库这条记录的 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) 1 filwaline 2022-07-14 11:50:57 +08:00 如果只需要 id 的话,那就任务执行之前预分配个自定义 id 呗,然后作为参数传递给 task 。 强行 hack 一个 task 纯粹自找麻烦。 |
2 hanssx 2022-07-14 11:50:58 +08:00 插库操作返回的 id ,估计只能写到 redis 之类里面作媒介,定时去读了。 |
3 imycc 2022-07-14 12:49:13 +08:00 如果希望调用这个 task 的一方尽早地拿到 ID ,我的做法是在调用 task 之前,先创建一条初始化的记录,用个字段 state=init 表示,那些不确定的字段就赋一个初始值,然后把 id 作为参数传给 task 。 task 执行的时候,从数据库用 id 把指定记录捞出来,把状态改为 pending/running ,等执行结束再改个状态 |
5 cz5424 2022-07-14 13:59:53 +08:00 xxxxx.apply_async(task_id=xxxxx) |
6 zoofy 2022-07-14 14:00:22 +08:00 看代码感觉是用 django, 可以看下 django-celery-results |
7 37Y37 2022-07-14 14:07:33 +08:00 这个我写过,channels 做 websocket ,celery 异步读取丢给 channels https://blog.ops-coffee.cn/s/r5spytjrl0jjeauye4q_-q |