Python flask web 开发,大数据量计算并导出文件,如何解决超时问题? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
alvy
V2EX    Python

Python flask web 开发,大数据量计算并导出文件,如何解决超时问题?

  •  
  •   alvy 2017-01-12 12:02:05 +08:00 7101 次点击
    这是一个创建于 3268 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 问题描述:
      用户导出 excel 文件, excel 里面的内容需要经过复杂的查询和计算,如果数量很多,就会导致服务器压力较大,而且会超时倒不出来

    • 解决办法:
      采用 celery+redis ,后台队列运行,但是经常会出现任务丢失的情况,有的时候能导出,有的时候导出就没下文了。 不知道有没有其他解决办法?谢谢

    46 条回复    2017-01-22 20:26:54 +08:00
    jswh
        1
    jswh  
       2017-01-12 12:04:05 +08:00
    为什么不去修 bug?
    ming2050
        2
    ming2050  
       2017-01-12 12:07:14 +08:00
    既然都用上 celery 那么还是你们自己的问题 而不是解决方案的问题
    maemo
        3
    maemo  
       2017-01-12 12:23:19 +08:00
    试试 celery+rabbitmq 呢,我记得官方文档有说 redis 会有任务丢失的问题
    wellsc
        4
    wellsc  
       2017-01-12 12:28:14 +08:00
    @maemo 求出处~
    Zuckonit
        5
    Zuckonit  
       2017-01-12 12:33:31 +08:00
    确定丢失是因为 celery 的原因?
    alvy
        6
    alvy  
    OP
       2017-01-12 13:12:48 +08:00
    @jswh 额,你说任务丢失的 bug ?
    alvy
        7
    alvy  
    OP
       2017-01-12 13:13:17 +08:00
    @mringg 我不确定 celery 是不是最优解决方案,可能有别的方案呢
    alvy
        8
    alvy  
    OP
       2017-01-12 13:13:53 +08:00
    @maemo 我也求一下出处?如果是真的,我就换 rabbitmq
    alvy
        9
    alvy  
    OP
       2017-01-12 13:14:14 +08:00
    @Zuckonit 不确定是 celery 还是 redis
    ming2050
        10
    ming2050  
       2017-01-12 13:32:26 +08:00 via iPhone
    @alvy 文档上确实说 redis 可能会有些问题
    50vip
        11
    50vip  
       2017-01-12 13:36:27 +08:00
    @mringg celery+redis 会出现定时任务执行两次或多次的情况,自己加一个锁就好了。不是很大的问题吧~
    50vip
        12
    50vip  
       2017-01-12 13:37:08 +08:00
    并不会出现楼主所说的任务丢失。仅仅是定时任务多次执行的问题。
    alvy
        13
    alvy  
    OP
       2017-01-12 13:45:52 +08:00
    @50vip 那我这种情况是什么原因呢?
    wwqgtxx
        14
    wwqgtxx  
       2017-01-12 13:49:53 +08:00 via iPhone
    我用 python-rq 觉得挺稳定的,没试过 celery
    gecco
        15
    gecco  
       2017-01-12 13:52:13 +08:00
    优化这个复杂的查询
    est
        16
    est  
       2017-01-12 13:56:37 +08:00
    先生成一个 下载 id 返回给客户端
    然后客户端用另一个 API 可以轮询下载 ID 是否就绪。
    50vip
        17
    50vip  
       2017-01-12 13:56:42 +08:00
    @alvy redis 有权限的人太多,被人清空,或者说这个 db 和其他的引用复用了?
    nanlong
        18
    nanlong  
       2017-01-12 16:08:16 +08:00
    文件流 https://blog.miguelgrinberg.com/post/video-streaming-with-flask

    没试过,不知道能不能解决你的问题,仅供参考。
    alvy
        19
    alvy  
    OP
       2017-01-12 16:16:43 +08:00
    @50vip 两台服务器公用同一个 redis 库,会导致此问题?
    simple2025
        20
    simple2025  
       2017-01-12 18:09:18 +08:00
    直接邮件啊
    maemo
        21
    maemo  
       2017-01-12 18:41:04 +08:00
    @alvy 在这里 http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#redis

    Redis is also feature-complete, but is more susceptible to data loss in the event of abrupt termination or power failures.
    ipconfiger
        22
    ipconfiger  
       2017-01-12 18:42:14 +08:00
    改 bug 去
    spice630
        23
    spice630  
       2017-01-12 21:24:31 +08:00
    压力大就加机器啊。你也没说清楚是计算压力大还是带宽有瓶颈
    推荐你用 golang ,也许就不会有修不完的问题了。 python 的第三方库有多少人维护你都不知道, bug 提给谁 会不会有人修你也不知道,这种情况用在生产环境就是 灾难。
    spice630
        24
    spice630  
       2017-01-12 21:27:03 +08:00
    另外 我们写 python 的同事今天刚刚放弃 flask ,程序崩溃找不到原因。
    eyp82
        25
    eyp82  
       2017-01-12 23:38:41 +08:00
    @alvy 这个出处就是 Celery 的官方文档, 确实说 Redis 有可能丢数据.
    coolair
        26
    coolair  
       2017-01-12 23:46:25 +08:00 via Android
    第三方库 bug 修的很慢,半年以上是常有的事,修了要进 pip 又得好久,然后,好多库你都维护了一个自己的版本,累。
    iamfredng
        27
    iamfredng  
       2017-01-13 01:08:33 +08:00
    我只想说你干嘛不开个线程?丢后面慢慢做,好了之后再回写一下结果?
    alvy
        28
    alvy  
    OP
       2017-01-13 09:47:03 +08:00
    @spice630 我也打算学 golang 来着。生产环境现在就是用的 python flask ,一时半会也改不了。
    alvy
        29
    alvy  
    OP
       2017-01-13 09:49:38 +08:00
    @iamfredng 啊,这个思路好,我研究下
    alvy
        30
    alvy  
    OP
       2017-01-13 09:50:47 +08:00
    @maemo 我先把不同的服务器配置到不同的 redis 库,再不行我就换 rabbitmq 试试
    wellsc
        31
    wellsc  
       2017-01-13 12:43:16 +08:00
    @spice630 那是你同事个人水平原因。。
    julyclyde
        32
    julyclyde  
       2017-01-13 13:47:58 +08:00
    @eyp82 celery 里哪句写了 redis 会丢?
    julyclyde
        33
    julyclyde  
       2017-01-13 13:48:15 +08:00
    @spice630 那是你同事个人水平原因。。
    spice630
        34
    spice630  
       2017-01-13 14:10:10 +08:00 via iPhone
    @wellsc
    所以说 python 麻烦啊
    wellsc
        35
    wellsc  
       2017-01-13 14:20:59 +08:00
    @spice630 又见神论。(你同事放弃 flask ) -> ( Python 麻烦)。这不严谨
    eyp82
        36
    eyp82  
       2017-01-13 23:56:06 +08:00
    @julyclyde http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html

    Redis is also feature-complete, but is more susceptible to data loss in the event of abrupt termination or power failures. Detailed information about using Redis:

    只是说断点或者异常终止的情况下**有可能**会丢数据, 应该是 Redis 轻量化设计的外沿就到这了. 正常运行的时候应该不至于老丢数据, 否则就是大 bug 那还了得.
    eyp82
        37
    eyp82  
       2017-01-13 23:57:27 +08:00
    楼上有说 Python 第三方库有问题然后转 golang 的, 按我的理解 golang 的第三方库也会有类似的问题啊? 还是说 golang 第三方库审核很严格, 长时间不更新就给踢出去, 所以能留下的都是精品?
    skywatcher
        38
    skywatcher  
       2017-01-14 01:15:48 +08:00
    既然慢就异步,感觉 celery+redis 应该是能解决你的问题。第一个 check 会不会是你的 redis 被另一个调用方清理了,然后记得详细打印日志,很有可能是 celery 任务里执行失败了。我们整个公司的应用发布任务都在 celery+redis 里,没发现你说的问题。
    iamfredng
        39
    iamfredng  
       2017-01-14 16:17:51 +08:00
    @alvy 我有个游戏客户端编译系统就是在 Flask 上开发的。编译个客户端轻则 10 分钟以上,也是开个线程后面慢慢编译,好了通知一下 Flask 完成。 web 就 js 轮询结果即可
    alvy
        40
    alvy  
    OP
       2017-01-15 21:15:13 +08:00
    @skywatcher 求教,多台 web 服务器的 celery 公用有个 redis 的数据库可以吗? celery 启用几个 worker 合适?
    julyclyde
        41
    julyclyde  
       2017-01-15 23:42:20 +08:00
    @eyp82 你这点儿连完成与否都不一定的任务,目前还不需要考虑基础软件的稳定性问题。
    eyp82
        42
    eyp82  
       2017-01-16 00:22:17 +08:00
    @julyclyde 啥? 我不是楼主
    gevin
        43
    gevin  
       2017-01-16 09:01:48 +08:00
    @maemo redis + celery 丢失任务,是指服务器断电重启时才会发生的情况吧
    liyj144
        44
    liyj144  
       2017-01-16 11:24:46 +08:00
    用 flower 监控下 celery ,大并发下 celery 可能会有处理失败,但是应该不会丢失任务(除非 broker 存储的任务丢失,这就是 redis 或 mq 配置问题了)。
    skywatcher
        45
    skywatcher  
       2017-01-16 14:25:43 +08:00
    @alvy 共用一个 redis 没什么问题,但是不要清空别的 web 的数据,前缀要不一样,最好能分开。我们是一台 4 核 8G 的虚拟机启用 8 个 worker , worker 不够你可以多台机器同时开启 worker 一起去抢 redis 的任务
    alvy
        46
    alvy  
    OP
       2017-01-22 20:26:54 +08:00
    @skywatcher "但是不要清空别的 web 的数据,前缀要不一样,最好能分开" ,我不太明白。我现在有 3 台服务器,每台启动两个 worker ,配置是 CELERYD_NODES=2 , 3 台服务器 celery 的 broker 都是练的同一个 redis ,但是簇不一样,比如一台服务器的 broker 是 CELERY_RESULT_BACKEND = 'redis://10.174.93.111:6379/5',另一台是 CELERY_RESULT_BACKEND = 'redis://10.174.93.111:6379/2'
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1183 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 17:42 PVG 01:42 LAX 09:42 JFK 12:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86