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

tornado AsyncHTTPClient 和 CurlAsyncHTTPClient 并发问题

  •  
  •   iawavij · 2020-06-29 13:14:51 +08:00 · 1911 次点击
    这是一个创建于 1604 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我使用 tornado 做的一个 web api,里面没有数据库存储业务,主要业务是调用第三方 web api 接口。 刚开始时使用的是 requests 模块来做 http 请求,结果发现并发稍高一点的时候 nginx 里大量请求超时的日志,后来通过搜索相关资料,发现 tornado 需要使用异步 httpclient,踩了第一个坑。

    后面将请求第三方接口全部替换成 AsyncHTTPClient 后,上述问题立马解决,并发能力大大提升,nginx 错误日志也没有了。 再后来根据业务需求,需要在请求第三方接口的时候使用 proxy,AsyncHTTPClient 不支持 proxy 设置,需要改用 CurlAsyncHTTPClient,按照官方文档修改好代码后,又出现了并发超时问题,将 CurlAsyncHTTPClient 改回 AsyncHTTPClient 问题就消失。

    avatar 这张图是使用 AsyncHTTPClient 的时候,服务器运行情况,每个进程有多个子进程。

    而当使用 CurlAsyncHTTPClient 或 requests 的时候,每个进程下面就只有一个子进程了,也就产生了并发瓶颈问题。

    • [官方文档提醒] 注意, 如果你正在使用 curl_httpclient, 强力建议你使用最新版本的 libcurl 和 pycurl. 当前 libcurl 能被支持的最小版本是 7.21.1, pycurl 能被支持的最小版本是 7.18.2. 强烈建议你所安装的 libcurl 是和异步 DNS 解析器 (threaded 或 c-ares) 一起构建的, 否则你可能会遇到各种请求超时的问题。*

    按照文档要求,重新编译服务器 curl 。c-ares 也支持了,但还是无法解决问题。 avatar

    以上就是问题的描述了,希望大佬能帮忙提供一下解决思路。

    9 条回复    2020-06-29 21:42:51 +08:00
    TypeError
        1
    TypeError  
       2020-06-29 13:22:58 +08:00 via Android
    换 HTTPX
    如果是 Python2 那就麻烦了,
    或者可以试试 threadpoolexecutor
    TypeError
        2
    TypeError  
       2020-06-29 13:25:31 +08:00 via Android
    ThreadPoolExecutor + Requests 也能异步请求,效率可能比 httpx 低一点
    Vegetable
        3
    Vegetable  
       2020-06-29 13:30:15 +08:00
    python2 下,为了减少代码变动,可以在本地搭建一个中转服务,中转服务使用 httpx 这种支持代理的异步网络库去请求第三方。
    iawavij
        4
    iawavij  
    OP
       2020-06-29 13:41:50 +08:00
    感谢两位大佬指点,忘记说了,项目是 py3,proxy 使用的是 socks5,考虑过 httpx,查看文档暂不 socks 类型 proxy 。
    676529483
        5
    676529483  
       2020-06-29 13:53:22 +08:00
    tornado 的异步客户端我也用过,感觉不好用,最后换了 aiohttp
    syrupofplum
        6
    syrupofplum  
       2020-06-29 13:56:52 +08:00
    socks5 代理都没发现有原生支持,要么用第三方库辅助支持,要么自己做一些协议转换吧。
    iawavij
        7
    iawavij  
    OP
       2020-06-29 18:07:50 +08:00
    目前使用 run_in_executor 运行 requests 先顶着
    本机测试 CurlAsyncHTTPClient 比 AsyncHTTPClient 和 requests 效率都高很多,应该还是服务器 curl 编译的问题
    chenqh
        8
    chenqh  
       2020-06-29 20:48:10 +08:00
    @676529483 在 tornado 里面怎么嵌入 aiohttp 呢?
    676529483
        9
    676529483  
       2020-06-29 21:42:51 +08:00
    @chenqh 就和你用 requests 一样呗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3189 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:28 · PVG 21:28 · LAX 05:28 · JFK 08:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.