推荐学习书目
› 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 · Jan 12, 2017 · 7827 views
    This topic created in 3582 days ago, the information mentioned may be changed or developed.
    • 问题描述:
      用户导出 excel 文件, excel 里面的内容需要经过复杂的查询和计算,如果数量很多,就会导致服务器压力较大,而且会超时倒不出来

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

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

    没试过,不知道能不能解决你的问题,仅供参考。
    alvy
    alvy
    OP
    Jan 12, 2017
    19
    @50vip 两台服务器公用同一个 redis 库,会导致此问题?
    simple2025
    simple2025
    Jan 12, 2017
    20
    直接邮件啊
    maemo
    maemo
    Jan 12, 2017
    21
    @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
    ipconfiger
    Jan 12, 2017
    22
    改 bug 去
    spice630
    spice630
    Jan 12, 2017
    23
    压力大就加机器啊。你也没说清楚是计算压力大还是带宽有瓶颈
    推荐你用 golang ,也许就不会有修不完的问题了。 python 的第三方库有多少人维护你都不知道, bug 提给谁 会不会有人修你也不知道,这种情况用在生产环境就是 灾难。
    spice630
    spice630
    Jan 12, 2017
    24
    另外 我们写 python 的同事今天刚刚放弃 flask ,程序崩溃找不到原因。
    eyp82
    eyp82
    Jan 12, 2017
    25
    @alvy 这个出处就是 Celery 的官方文档, 确实说 Redis 有可能丢数据.
    coolair
    coolair
    Jan 12, 2017 via Android
    26
    第三方库 bug 修的很慢,半年以上是常有的事,修了要进 pip 又得好久,然后,好多库你都维护了一个自己的版本,累。
    iamfredng
    iamfredng
    Jan 13, 2017
    27
    我只想说你干嘛不开个线程?丢后面慢慢做,好了之后再回写一下结果?
    alvy
    alvy
    OP
    Jan 13, 2017
    28
    @spice630 我也打算学 golang 来着。生产环境现在就是用的 python flask ,一时半会也改不了。
    alvy
    alvy
    OP
    Jan 13, 2017
    29
    @iamfredng 啊,这个思路好,我研究下
    alvy
    alvy
    OP
    Jan 13, 2017
    30
    @maemo 我先把不同的服务器配置到不同的 redis 库,再不行我就换 rabbitmq 试试
    wellsc
    wellsc
    Jan 13, 2017
    31
    @spice630 那是你同事个人水平原因。。
    julyclyde
    julyclyde
    Jan 13, 2017
    32
    @eyp82 celery 里哪句写了 redis 会丢?
    julyclyde
    julyclyde
    Jan 13, 2017
    33
    @spice630 那是你同事个人水平原因。。
    spice630
    spice630
    Jan 13, 2017 via iPhone
    34
    @wellsc
    所以说 python 麻烦啊
    wellsc
    wellsc
    Jan 13, 2017
    35
    @spice630 又见神论。(你同事放弃 flask ) -> ( Python 麻烦)。这不严谨
    eyp82
    eyp82
    Jan 13, 2017
    36
    @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
    eyp82
    Jan 13, 2017
    37
    楼上有说 Python 第三方库有问题然后转 golang 的, 按我的理解 golang 的第三方库也会有类似的问题啊? 还是说 golang 第三方库审核很严格, 长时间不更新就给踢出去, 所以能留下的都是精品?
    skywatcher
    skywatcher
    Jan 14, 2017
    38
    既然慢就异步,感觉 celery+redis 应该是能解决你的问题。第一个 check 会不会是你的 redis 被另一个调用方清理了,然后记得详细打印日志,很有可能是 celery 任务里执行失败了。我们整个公司的应用发布任务都在 celery+redis 里,没发现你说的问题。
    iamfredng
    iamfredng
    Jan 14, 2017
    39
    @alvy 我有个游戏客户端编译系统就是在 Flask 上开发的。编译个客户端轻则 10 分钟以上,也是开个线程后面慢慢编译,好了通知一下 Flask 完成。 web 就 js 轮询结果即可
    alvy
    alvy
    OP
    Jan 15, 2017
    40
    @skywatcher 求教,多台 web 服务器的 celery 公用有个 redis 的数据库可以吗? celery 启用几个 worker 合适?
    julyclyde
    julyclyde
    Jan 15, 2017
    41
    @eyp82 你这点儿连完成与否都不一定的任务,目前还不需要考虑基础软件的稳定性问题。
    eyp82
    eyp82
    Jan 16, 2017
    42
    @julyclyde 啥? 我不是楼主
    gevin
    gevin
    Jan 16, 2017
    43
    @maemo redis + celery 丢失任务,是指服务器断电重启时才会发生的情况吧
    liyj144
    liyj144
    Jan 16, 2017
    44
    用 flower 监控下 celery ,大并发下 celery 可能会有处理失败,但是应该不会丢失任务(除非 broker 存储的任务丢失,这就是 redis 或 mq 配置问题了)。
    skywatcher
    skywatcher
    Jan 16, 2017
    45
    @alvy 共用一个 redis 没什么问题,但是不要清空别的 web 的数据,前缀要不一样,最好能分开。我们是一台 4 核 8G 的虚拟机启用 8 个 worker , worker 不够你可以多台机器同时开启 worker 一起去抢 redis 的任务
    alvy
    alvy
    OP
    Jan 22, 2017
    46
    @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'
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5198 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 149ms · UTC 02:52 · PVG 10:52 · LAX 18:52 · JFK 21:52
    ♥ Do have faith in what you're doing.