Django 异步请求?

2017-05-19 15:36:40 +08:00
 linkbg

不知道这样问合不合理。异步处理。

场景是这样: 有个请求需要查询数据库,然后数据量比较大,就使用了 limit。速度快了,但是有一部分,数据需要共享。比如统计这部分类型的数量。加入 limit 之后统计的数量就是 limit 参数的数量。

目前想法是,在这个请求返回之后后台执行一个查询全部的。

搜到的解决方案是 django-celery。 不知道有没有其他比较轻的解决方案呢? 谢谢

3820 次点击
所在节点    Django
17 条回复
lovedboy
2017-05-19 15:43:44 +08:00
fork 进程来做这件事啊==
linkbg
2017-05-19 15:46:34 +08:00
@lovedboy 我不是很理解如何使用,因为 request 请求,不是要等到所有处理完才能返回页面吗?
KIDJourney
2017-05-19 15:48:36 +08:00
@lovedboy 你觉得 fork 是轻量级的解决方案吗。

在 python 里因为 GC 的原因,fork 基本是必定触发 COW 的 write,每次都起个进程做事情对 python 来说负担太大了。
KIDJourney
2017-05-19 15:49:23 +08:00
@linkbg 感觉你的需求说的不够明确啊,数据需要共享是什么意思?
111111111111
2017-05-19 15:49:36 +08:00
没懂你要做什么
>比如统计这部分类型的数量
可再 view 里查询 User.objects.filter().count()
111111111111
2017-05-19 15:50:37 +08:00
@111111111111 #5 居然直接发了
一个请求可以返回两部分数据
当前 limit 数据内容 + 全部的 count,分开查,不影响
mansur
2017-05-19 15:52:50 +08:00
请求插队列里,然后 while 去都 redis 约定的 key,开个后台进程,专门处理这个队列,查询完了通过约定的 key 存入 redis,那边读到这个 key 后就可以返回给用户了
111111111111
2017-05-19 15:54:27 +08:00
@mansur #7 那边没读到这个 key 怎么办
mansur
2017-05-19 15:56:20 +08:00
一直 while,sleep 一秒或几秒,设个超时时间,超过了就返回查询超时
linkbg
2017-05-19 15:59:03 +08:00
@KIDJourney
@111111111111

有这么一条查询
```
db.tests.find({},{'age':14}).limit(100)
```
上面的查询可以返回:住址,城市,来源。
数据共享,说法可能不准确
上面的结构会有这样的统计
```
city
beijing 99
shanghai 1
```
但是想要的是满足年龄=14 的,城市是北京的总数!

@111111111111 提到的分开查,这样就得等到所有查询完成才能返回页面。这样 limit 就没有用了。
jimzhong
2017-05-19 16:03:41 +08:00
@mansur

赞同这种做法。提供两个 API,一个用于发起查询,另一个用于获取查询状态 /结果。查询操作交给任务队列完成。
JasperYanky
2017-05-19 16:09:11 +08:00
Huey 可能是最轻量级的 Celery > RQ > Huey
JasperYanky
2017-05-19 16:10:33 +08:00
另外 有些操作前端异步可能更好点,直接返回部分数据,后续数据前端到 API 里去查~
awanabe
2017-05-19 16:17:31 +08:00
celery 挺好的方案, 丢进去异步处理,搞一个长连接或者轮询去查最终结果输出的地方,比如数据库,Redis, 查到了就展现不就好了么。。
PythoneerDev6
2017-05-19 20:34:39 +08:00
@KIDJourney 赞成。 其次 Python 的 GIL 就是一个巨大坑点。没太大卵用。要 fork 来解决这个问题,简直就是增加 Python 的负担。
sagaxu
2017-05-20 01:16:29 +08:00
@PythoneerDev6 GIL 对 cpu 密集型才有影响,db 对 python 而言只是在等 io,显然 GIL 不会有任何影响
lovedboy
2017-05-21 19:57:34 +08:00
@PythoneerDev6 Fork 和 GIL 有啥关系....
@KIDJourney 对于不是频繁执行的,我觉得 fork 总比引入 celery 要好==

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

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

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

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

© 2021 V2EX