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
itertools
V2EX  ›  Python

服务端处理耗时任务思路

  •  
  •   itertools · 2017-07-03 20:43:09 +08:00 · 3762 次点击
    这是一个创建于 2734 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求是客户会上传单个或者很多文件,要求提供的接口把处理结果返回客户端。 我目前的思路有: 对于单个文件可以直接等待处理完成,然后把结果返回客户端。 对于批量文件可以通过 celery 把处理任务发送其他 worker 去处理,然后,返回一个新的接口供客户端进行结果轮询。

    (服务端处理这些文件需要好几分钟) 现在有几个问题就是:

    • 如果要求一次请求就给出客户端返回结果,那么服务端就会阻塞住接口或者占用一个处理线程。那么用户量多的时候,一直被阻塞住怎么办吗?
    • 如果不要求一次请求返回结果,我上面的思路是否有问题。还有其他的解决思路吗?

    谢谢!

    13 条回复    2017-07-04 14:42:40 +08:00
    fatedier
        1
    fatedier  
       2017-07-03 21:04:03 +08:00
    异步任务 && IO 多路复用
    Reign
        2
    Reign  
       2017-07-03 21:09:01 +08:00 via iPhone
    与其在这多耗脑细胞不如多买几台服务器
    beneo
        3
    beneo  
       2017-07-03 21:11:27 +08:00
    上传都走 CDN,客户端传 URL 到服务端
    misaka19000
        4
    misaka19000  
       2017-07-03 21:26:20 +08:00 via Android
    @Reign 服务器就是钱啊。。。
    misaka19000
        5
    misaka19000  
       2017-07-03 21:29:18 +08:00 via Android
    感觉用户量多的时候无解,只能做集群来提升任务处理能力
    itertools
        6
    itertools  
    OP
       2017-07-03 21:37:19 +08:00
    @fatedier 那有什么异步框架可以推荐下?
    还有几个疑问请教:就是如果服务端接口采用异步框架处理这个任务。
    (假设这耗时任务使用了 5 分钟)
    1.如果客户端使用同步请求,那么客户端是否就一直阻塞五分钟?这样不会出现请求超时,连接中断问题吗?
    2.如果客户端使用异步请求,那么客户端五分钟之后就能接到处理结果?这五分钟之内是怎么保持连接不中断的?

    谢谢!
    SlipStupig
        7
    SlipStupig  
       2017-07-03 21:46:14 +08:00
    @beneo 上传走 cdn 作用不大,都是 stream 数据,cdn 根本 cache 不到
    我的想法是 HAProxy 做负载均衡,后台开多个 server,用 celery 可以开多个 worker,可以选 gevent,然后把相关数据全部存储到远程的对象存储(建议用第三方)上,当客户请求,相应相关 URL,让客户端下载就行了,多个和一个没什么区别?
    yidinghe
        8
    yidinghe  
       2017-07-03 23:20:04 +08:00
    统一用轮询来查询处理状态,这样给将来留下的余地比较好。
    mooncakejs
        9
    mooncakejs  
       2017-07-03 23:23:07 +08:00 via iPhone
    @SlipStupig 他说的是直传
    em70
        10
    em70  
       2017-07-03 23:25:13 +08:00 via Android
    可以看看优酷,YouTube 对上传视频转码是如何处理的,上传后出现到列表,状态显示正在处理,用户可以随时上来看处理完了没
    ericls
        11
    ericls  
       2017-07-03 23:27:36 +08:00 via iPhone
    我觉得只要用 websocket 让客户知道处理的进度就好了
    Morriaty
        12
    Morriaty  
       2017-07-04 12:01:37 +08:00
    接口直接返回一个 upload_id,异步处理上传,再给一个查询 upload_id 进度的接口
    ma125125t
        13
    ma125125t  
       2017-07-04 14:42:40 +08:00
    文件存储用第三方
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   981 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:57 · PVG 06:57 · LAX 14:57 · JFK 17:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.