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

api请求相应需要20s左右,tornado能应付吗?

  •  
  •   BeanYoung · 2013-07-11 15:17:46 +08:00 · 3722 次点击
    这是一个创建于 3950 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求是这样的,app调用api,但某些api需要20s左右的执行响应时间。
    目前的做法是,前端调用api,服务端收到请求后,将主要的耗时运算添加到任务队列,然后api马上返回,前端每隔几秒重新调用这个api,获取那个耗时运算的计算结果。目前用到的东西主要是flask+rq。
    这个方法目前运转良好,不过现在要将系统的api开放给其他公司使用,对方希望api能够一次就返回计算结果。
    如果按照对方的需求,每次请求都需要20s,甚至更长时间才能响应,这种事情应该用什么方案来做?用tornado能解决这个问题吗?或者是需要用其他更擅长处理这样请求的技术,比如golang或者erlang?
    6 条回复    1970-01-01 08:00:00 +08:00
    lookhi
        1
    lookhi  
       2013-07-11 15:26:33 +08:00
    把你现在的做法再包装一层,与用户那个链接不断就好了。
    dancercl
        2
    dancercl  
       2013-07-11 15:36:53 +08:00
    golang做这个很容易
    qiongqi
        3
    qiongqi  
       2013-07-11 15:41:27 +08:00
    嘿嘿,我推荐openresty,IO不阻塞
    BOYPT
        4
    BOYPT  
       2013-07-11 16:26:18 +08:00
    所有非阻塞模型都可以吧...

    不过这样的工作模式不好,API执行过程中很可能受其他影响而中断,就没了返回结果了。
    openroc
        5
    openroc  
       2013-07-12 11:46:08 +08:00
    async + fork process + callback
    Livid
        6
    Livid  
    MOD
       2013-12-14 03:41:12 +08:00
    对方的这个需求真的不太合理。

    对于耗时的任务,第一次 API call 的时候,可以立刻返回一个 Async job ID,然后对方的后续的请求,根据这个 Async job ID 来取结果。结果应该是存放在 Memcache 里的,可以高速访问。

    很多 Cloud 平台的 API 就是这样的,比如你要创建一台 VM,显然是不可能立刻返回结果的。而是返回一个 job ID。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2408 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:19 · PVG 18:19 · LAX 03:19 · JFK 06:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.