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 · 6484 次点击
    这是一个创建于 2863 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 问题描述:
      用户导出 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?
    mringg
        2
    mringg  
       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
    mringg
        10
    mringg  
       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 库,会导致此问题?
    chenqh
        20
    chenqh  
       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   ·   实用小工具   ·   3992 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:11 · PVG 13:11 · LAX 21:11 · JFK 00:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.