gpt4 book ai didi

python - 使用 aiohttp/asyncio 的异步 HTTP 调用失败并显示 "Cannot connect to host [Network is unreachable]"

转载 作者:行者123 更新时间:2023-12-04 18:57:50 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





python 3.5 asyncio and aiohttp Errno 101 Network is unreachable

(1 个回答)


4年前关闭。




我正在实现一个快速异步 REST 接口(interface)调用程序,我想用它以同步方式上传数据。现在我将构建一个异步框架,它只是以异步方式调用 python 页面并测量延迟。

这是代码(如下所述不起作用):

import aiohttp
import asyncio
import async_timeout
from timeit import default_timer as timer

async def fetch(session, url):
start = timer()
with async_timeout.timeout(10):
async with session.get(url) as response:
date = response.headers.get("DATE")
end = timer()
delay = end - start
print("{}:{} with delay {} s".format(date, response.url, delay))
return await response.read()

async def bound_call(semaphore, session, url):
async with semaphore:
await fetch(session, url)

async def perform_call(session):
sem = asyncio.Semaphore(1000)
html = await bound_call(sem, session, 'http://python.org')

async def perform_calls(n):
tasks = []
async with aiohttp.ClientSession() as session:
for i in range(n):
task = perform_call(session)
tasks.append(task)

responses = asyncio.gather(*tasks)
await responses

call_number = 10

loop = asyncio.get_event_loop()
loop.run_until_complete(perform_calls(call_number))

只要我使用它就可以正常工作
await perform_call(session)

但这显然会破坏异步调用。如果我将其替换为
            task = perform_call(session)
tasks.append(task)

responses = asyncio.gather(*tasks)
await responses

为了让它同时等待所有响应,我收到以下错误:
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host python.org:80 ssl:False [Network is unreachable]

我尝试将其作为 jupyter notebook 中的代码运行,并且由于它没有运行,因此将其复制到普通代码中。在这两种情况下,它都在 python 3.5 上运行。不幸的是,我找不到问题的解决方案。一旦我尝试使用收集,似乎就没有网络访问权限。有没有人建议为什么它不起作用?我很高兴有任何建议。

最佳答案

好的,我在我的问题重复的问题中找到了答案(我在这里发布后才发现重复。)

解决方案只是使用以下方法初始化客户端 session :

import socket # together with your other imports

conn = aiohttp.TCPConnector(
family=socket.AF_INET,
verify_ssl=False,
)

# Create client session that will ensure we dont open new connection
# per each request.
async with aiohttp.ClientSession(connector=conn) as session:

基于副本的解释:
客户端 session 将使用连接而不是默认的 AsyncResolver 作为连接的解析器。它曾经是默认的解析器。问题似乎与 AsyncResolver 有问题的 ipv6 域有关,因此解决方案是简单地将族指定为 ipv4 地址,这就是我们对 family=socket.AF_INET 所做的事情。 .

重复: python 3.5 asyncio and aiohttp Errno 101 Network is unreachable

关于python - 使用 aiohttp/asyncio 的异步 HTTP 调用失败并显示 "Cannot connect to host [Network is unreachable]",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48007453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com