我有一组 URL(相同的 http 服务器但不同的请求参数)。我想要实现的是继续异步或并行请求所有这些,直到我杀死它。
我开始使用threading.Thread()
为每个 URL 创建一个线程,并while True:
在请求函数中执行一个循环。当然,这已经比单线程/单请求更快了。但我想取得更好的成绩。
然后我尝试aiohttp
了库来异步运行请求。我的代码是这样的(仅供参考,每个 URL 都由url_base
and组成product.id
,每个 URL 都有一个不同的代理用于请求):
async def fetch(product, i, proxies, session):
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}
while True:
try:
async with session.get(
url_base + product.id,
proxy = proxies[i],
headers=headers,
ssl = False)
) as response:
content = await response.read()
print(content)
except Exception as e:
print('ERROR ', str(e))
async def startQuery(proxies):
tasks = []
async with aiohttp.ClientSession() as session:
for [i, product] in enumerate(hermes_products):
task = asyncio.ensure_future(fetch(product, i, proxies, session))
tasks.append(task)
responses = asyncio.gather(*tasks)
await responses
loop = asyncio.get_event_loop()
loop.run_until_complete(startQuery(global_proxy))
观察结果是:1)它没有我预期的那么快。实际上比使用线程慢。2)更重要的是,请求只在运行开始时返回正常,很快几乎所有请求都返回了几个错误,例如:
ERROR Cannot connect to host PROXY_IP:PORT ssl:False [Connect call failed ('PROXY_IP', PORT)]
或者
ERROR 503, message='Too many open connections'
或者
ERROR [Errno 54] Connection reset by peer
我在这里做错了什么(尤其是while True
循环?如果是这样,我怎样才能正确地实现我的目标?