问题描述
我有一组URL(相同的http服务器,但请求参数不同)。我要实现的是继续异步或并行请求所有请求,直到我杀死它。
我首先使用threading.Thread()
为每个URL创建一个线程,然后在请求函数中进行while True:
循环。当然,这已经比单线程/单请求更快。但我想获得更好的性能。
然后我尝试使用aiohttp
库来异步运行请求。我的代码是这样的(仅供参考,每个URL由url_base
和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,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
循环中?如果是这样,我如何正确地实现自己的目标?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)