我被一个似乎与asyncio
+相关的问题难住了aiohttp
,当发送大量并发 GET 请求时,超过 85% 的请求会引发一个aiohttp.client_exceptions.ClientConnectorError
异常,该异常最终源于
socket.gaierror(8, 'nodename nor servname provided, or not known')
发送单个 GET 请求或在主机/端口上执行底层 DNS 解析时不会引发此异常。
在我的真实代码中,我进行了大量自定义,例如使用自定义TCPConnector
实例,我可以仅使用“默认”aiohttp
类实例和参数来重现该问题,如下所示。
我遵循了回溯,异常的根源与 DNS 解析有关。它来自 的_create_direct_connection
方法aiohttp.TCPConnector
,它调用._resolve_host()
.
我也试过:
使用(和不使用) aiodns
sudo killall -HUP mDNSResponder
使用family=socket.AF_INET
作为参数传递给TCPConnector
(虽然我相当肯定,这是使用aiodns
反正)。这使用2
而不是该0
参数的默认 int
随着ssl=True
和ssl=False
一切都无济于事。
要重现的完整代码如下。输入 URL 位于https://gist.github.com/bsolomon1124/fc625b624dd26ad9b5c39ccb9e230f5a。
从res看起来像打印每个异常字符串:
Cannot connect to host sigmainvestments.com:80 ssl:False [nodename nor servname provided, or not known]
Cannot connect to host giaoducthoidai.vn:443 ssl:False [nodename nor servname provided, or not known]
Cannot connect to host chauxuannguyen.org:80 ssl:False [nodename nor servname provided, or not known]
Cannot connect to host www.baohomnay.com:443 ssl:False [nodename nor servname provided, or not known]
Cannot connect to host www.soundofhope.org:80 ssl:False [nodename nor servname provided, or not known]
# And so on...
令人沮丧的是,我可以ping毫无问题地使用这些主机,甚至可以调用底层._resolve_host():
重击/外壳:
[~/] $ ping -c 5 www.hongkongfp.com
PING www.hongkongfp.com (104.20.232.8): 56 data bytes
64 bytes from 104.20.232.8: icmp_seq=0 ttl=56 time=11.667 ms
64 bytes from 104.20.232.8: icmp_seq=1 ttl=56 time=12.169 ms
64 bytes from 104.20.232.8: icmp_seq=2 ttl=56 time=12.135 ms
64 bytes from 104.20.232.8: icmp_seq=3 ttl=56 time=12.235 ms
64 bytes from 104.20.232.8: icmp_seq=4 ttl=56 time=14.252 ms
--- www.hongkongfp.com ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 11.667/12.492/14.252/0.903 ms
Python:
小怪兽爱吃肉
相关分类