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