不知道这样问合不合理。异步处理。
场景是这样: 有个请求需要查询数据库,然后数据量比较大,就使用了 limit。速度快了,但是有一部分,数据需要共享。比如统计这部分类型的数量。加入 limit 之后统计的数量就是 limit 参数的数量。
目前想法是,在这个请求返回之后后台执行一个查询全部的。
搜到的解决方案是 django-celery。 不知道有没有其他比较轻的解决方案呢? 谢谢
1
lovedboy 2017-05-19 15:43:44 +08:00 1
fork 进程来做这件事啊==
|
3
KIDJourney 2017-05-19 15:48:36 +08:00
@lovedboy 你觉得 fork 是轻量级的解决方案吗。
在 python 里因为 GC 的原因,fork 基本是必定触发 COW 的 write,每次都起个进程做事情对 python 来说负担太大了。 |
4
KIDJourney 2017-05-19 15:49:23 +08:00
@linkbg 感觉你的需求说的不够明确啊,数据需要共享是什么意思?
|
5
111111111111 2017-05-19 15:49:36 +08:00
没懂你要做什么
>比如统计这部分类型的数量 可再 view 里查询 User.objects.filter().count() |
6
111111111111 2017-05-19 15:50:37 +08:00
|
7
mansur 2017-05-19 15:52:50 +08:00 1
请求插队列里,然后 while 去都 redis 约定的 key,开个后台进程,专门处理这个队列,查询完了通过约定的 key 存入 redis,那边读到这个 key 后就可以返回给用户了
|
8
111111111111 2017-05-19 15:54:27 +08:00
@mansur #7 那边没读到这个 key 怎么办
|
9
mansur 2017-05-19 15:56:20 +08:00
一直 while,sleep 一秒或几秒,设个超时时间,超过了就返回查询超时
|
10
linkbg OP @KIDJourney
@111111111111 有这么一条查询 ``` db.tests.find({},{'age':14}).limit(100) ``` 上面的查询可以返回:住址,城市,来源。 数据共享,说法可能不准确 上面的结构会有这样的统计 ``` city beijing 99 shanghai 1 ``` 但是想要的是满足年龄=14 的,城市是北京的总数! @111111111111 提到的分开查,这样就得等到所有查询完成才能返回页面。这样 limit 就没有用了。 |
11
jimzhong 2017-05-19 16:03:41 +08:00
|
12
JasperYanky 2017-05-19 16:09:11 +08:00
Huey 可能是最轻量级的 Celery > RQ > Huey
|
13
JasperYanky 2017-05-19 16:10:33 +08:00
另外 有些操作前端异步可能更好点,直接返回部分数据,后续数据前端到 API 里去查~
|
14
awanabe 2017-05-19 16:17:31 +08:00
celery 挺好的方案, 丢进去异步处理,搞一个长连接或者轮询去查最终结果输出的地方,比如数据库,Redis, 查到了就展现不就好了么。。
|
15
PythoneerDev6 2017-05-19 20:34:39 +08:00
@KIDJourney 赞成。 其次 Python 的 GIL 就是一个巨大坑点。没太大卵用。要 fork 来解决这个问题,简直就是增加 Python 的负担。
|
16
sagaxu 2017-05-20 01:16:29 +08:00
@PythoneerDev6 GIL 对 cpu 密集型才有影响,db 对 python 而言只是在等 io,显然 GIL 不会有任何影响
|
17
lovedboy 2017-05-21 19:57:34 +08:00
|