注意事項(xiàng):這是我第一次使用 asyncio,所以我可能做了一些非常愚蠢的事情。場(chǎng)景如下:我需要“http-ping”一個(gè)巨大的 url 列表來(lái)檢查它們是否響應(yīng) 200 或任何其他值。盡管像 gobuster report 200,403 等工具,我對(duì)每個(gè)請(qǐng)求都會(huì)超時(shí)。我的代碼與此類似: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 我真的做錯(cuò)了什么嗎?有什么建議嗎?
2 回答

海綿寶寶撒
TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
實(shí)際上,我最終在 aio-libs/aiohttp 中發(fā)現(xiàn)了一個(gè)未解決的問(wèn)題: 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貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
添加回答
舉報(bào)
0/150
提交
取消