tornado AsyncHTTPClient 和 CurlAsyncHTTPClient 并发问题

2020-06-29 13:14:51 +08:00
 iawavij

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

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

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

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

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

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

1911 次点击
所在节点    Python
9 条回复
TypeError
2020-06-29 13:22:58 +08:00
换 HTTPX
如果是 Python2 那就麻烦了,
或者可以试试 threadpoolexecutor
TypeError
2020-06-29 13:25:31 +08:00
ThreadPoolExecutor + Requests 也能异步请求,效率可能比 httpx 低一点
Vegetable
2020-06-29 13:30:15 +08:00
python2 下,为了减少代码变动,可以在本地搭建一个中转服务,中转服务使用 httpx 这种支持代理的异步网络库去请求第三方。
iawavij
2020-06-29 13:41:50 +08:00
感谢两位大佬指点,忘记说了,项目是 py3,proxy 使用的是 socks5,考虑过 httpx,查看文档暂不 socks 类型 proxy 。
676529483
2020-06-29 13:53:22 +08:00
tornado 的异步客户端我也用过,感觉不好用,最后换了 aiohttp
syrupofplum
2020-06-29 13:56:52 +08:00
socks5 代理都没发现有原生支持,要么用第三方库辅助支持,要么自己做一些协议转换吧。
iawavij
2020-06-29 18:07:50 +08:00
目前使用 run_in_executor 运行 requests 先顶着
本机测试 CurlAsyncHTTPClient 比 AsyncHTTPClient 和 requests 效率都高很多,应该还是服务器 curl 编译的问题
chenqh
2020-06-29 20:48:10 +08:00
@676529483 在 tornado 里面怎么嵌入 aiohttp 呢?
676529483
2020-06-29 21:42:51 +08:00
@chenqh 就和你用 requests 一样呗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/685586

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX