注意事項:這是我第一次使用 asyncio,所以我可能做了一些非常愚蠢的事情。場景如下:我需要“http-ping”一個巨大的 url 列表來檢查它們是否響應 200 或任何其他值。盡管像 gobuster report 200,403 等工具,我對每個請求都會超時。我的代碼與此類似:import asyncio,aiohttpimport datetime #-------------------------------------------------------------------------------------async def get_data_coroutine(session,url,follow_redirects,timeout_seconds,retries): #print('#DEBUG '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+' '+url) try: async with session.get(url,allow_redirects=False,timeout=timeout_seconds) as response: status = response.status #res = await response.text() if( status==404): pass elif(300<=status and status<400): location = str(response).split("Location': \'")[1].split("\'")[0] print('#HIT '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+' '+str(status)+' '+url+' ---> '+location) if(follow_redirects==True): return await get_data_coroutine(session,location,follow_redirects,timeout_seconds,retries) else: print('#HIT '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+' '+str(status)+' '+url) return None except asyncio.exceptions.TimeoutError as e: print('#ERROR '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+' '+' '+' '+url+' TIMEOUT '+str(e)) return None 我真的做錯了什么嗎?有什么建議嗎?
2 回答

海綿寶寶撒
TA貢獻1809條經驗 獲得超8個贊
實際上,我最終在 aio-libs/aiohttp 中發現了一個未解決的問題: https://github.com/aio-libs/aiohttp/issues/3203
這樣,他們提出了一種可以滿足我的需求的解決方法:
session_timeout = aiohttp.ClientTimeout(total=None,sock_connect=timeout_seconds,sock_read=timeout_seconds)
async with aiohttp.ClientSession(timeout=session_timeout) as session:
async with session.get(url,allow_redirects=False,timeout=1) as response:
...

喵喔喔
TA貢獻1735條經驗 獲得超5個贊
添加回答
舉報
0/150
提交
取消