Django view 怎样可以先返回结果,再执行一部分其他逻辑?

2020-02-28 13:56:12 +08:00
 btv2bt

除去 Celery 的话,还有其他的办法么?

4485 次点击
所在节点    Django
32 条回复
iConnect
2020-02-28 13:59:57 +08:00
async 在一个线程里可以,thread 也可以在多个线程里
btv2bt
2020-02-28 14:16:33 +08:00
@iConnect 不是很明白,方便细说一下么
Livid
2020-02-28 14:18:08 +08:00
如果你可以说一下具体的应用场景,然后可能会有其他解决方法。
qile1
2020-02-28 14:24:44 +08:00
楼主是不是想,直接返回保存成功,另一个线程后台保存数据到数据库?
btv2bt
2020-02-28 14:25:26 +08:00
@Livid Windows 环境,API 接收到请求之后(随后告诉请求方参数已收到),根据参数执行一段 cmd 命令,命令执行完后再把结果返回给请求方
btv2bt
2020-02-28 14:28:31 +08:00
@qile1 嗯,类似,具体可以看上一条回复
woodensail
2020-02-28 14:30:44 +08:00
感觉是类似长连接的需求啊,这种做法服务端和客户端都得改造,代价太大了。
改用离线计算的方式来实现?
Livid
2020-02-28 14:33:39 +08:00
那么你可能需要这样来实现它:

API 收到请求之后,返回一个任务 ID,然后用异步任务去执行,执行完毕之后根据分配的任务 ID 写入结果。

请求方根据任务 ID 发起另外一个或者多个请求去拿结果,在异步任务没有完成之前会拿到「任务还没有执行完毕」,完成之后拿到的就是异步任务写入的结果。
cominghome
2020-02-28 14:36:49 +08:00
站长的方式靠谱。典型的异步任务流程。
btv2bt
2020-02-28 14:38:41 +08:00
@woodensail 离线计算怎么讲;
的确类似长链接,现在还没开始写…所以也还好,不知道有啥建议么

说到这,想起感觉可以中间用个 redis 之类的来处理下?
btv2bt
2020-02-28 14:41:10 +08:00
@Livid
@cominghome en ,现在思路就是这样的
只是不知道用哪种具体的方式来实现 异步任务
woodensail
2020-02-28 14:41:28 +08:00
站长给离线计算的方案了,另外就是注意离线计算结果的保存和销毁策略。可以考虑比如定时 1 小时销毁;或者按账号,每个账号只保留最新的一个计算结果。
Livid
2020-02-28 14:42:49 +08:00
不过貌似 Django 也考虑了这种情况,仅供参考吧:

https://stackoverflow.com/a/15569619
mimzy
2020-02-28 14:50:00 +08:00
有类似场景,用了 Celery,前端轮询结果,感觉轮询这里不太优雅
fengshils
2020-02-28 14:50:06 +08:00
使用 celery 返回任务 id,在定时去拿结果可好
est
2020-02-28 14:52:12 +08:00
具体是可以不用其他库实现的。

但是 LZ 说这个需求不对。你要的是浏览器配合。
676529483
2020-02-28 14:55:58 +08:00
一般都用 celery 做吧,如果用最新的 django3.0,可以考虑下 django_simple_backend 这个库
btv2bt
2020-02-28 15:01:06 +08:00
@mimzy 结果回写到 db,结果查询请求单独写个接口更合适些

@fengshils
btv2bt
2020-02-28 15:02:13 +08:00
@676529483 嗯,只是不太想在 Windows 上折腾 celery😂

服务器这边用了 celery 4,客户端这边 windows 又不支持 4,就有点蛋疼
wuwukai007
2020-02-28 15:10:43 +08:00
别用 celery 在 windows 上,用了还要在配个 redis,徒增成本

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

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

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

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

© 2021 V2EX