首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步/等待/ aiohttp

异步/等待/ aiohttp
EN

Stack Overflow用户
提问于 2022-05-22 19:31:08
回答 1查看 237关注 0票数 1

异步世界中的新事物。

直截了当..。

我想做/向一个网站提出请求(Aiohttp)。如果等待答案超过N秒,我想停止等待的过程。如果需要,可以通过设置尝试限制来再次执行此过程。

代码语言:javascript
复制
async def search_skiping_add(name_search):
    start_time = time()
    async with aiohttp.ClientSession() as session:
        url = f'https://somesitehere.com'
        r = await session.get(url)

    
    final_time = time()
    result_time =round(final_time-start_time)
    print(result_time)

也许,我知道,有一些方法可以同步完成,但它也是开始使用异步的借口。

EN

回答 1

Stack Overflow用户

发布于 2022-05-25 06:18:31

这应该会让您了解如何在aiohttp中使用异步:

代码语言:javascript
复制
from aiohttp import ClientSession
from asyncio import gather, create_task, sleep, run
from traceback import format_exc

def returnPartionedList(inputlist: list, x: int = 100) -> list: # returns inputlist split into x parts, default is 100
    return([inputlist[i:i + x] for i in range(0, len(inputlist), x)])

# You could change validate to an integer and thereby increasing the retry count as needed.
async def GetRessource(url: str, session: ClientSession, validate: bool = False) -> dict:
    try:
        async with session.get(url) as response:
            if response.status == 200:
                r: dict = await response.json() # Set equal to .text() to get results as a string
                return(r)
            else:
                r: str = await response.text()
                if not validate:
                    await sleep(3) # Sleep for x amount of seconds before retry
                    return(await GetRessource(url, session, True))
                print(f"Error, got response code: {response.status} message: {r}")
    except Exception:
        print(f"General Exception:\n{format_exc()}")
    return({})

async def GetUrls(urls: list) -> list:
    resultsList: list = []
    UrlPartitions: list = returnPartionedList(urls, 20) # Rate limit to 20 requests per loop
    async with ClientSession(timeout=15) as session: # Timeout is equal to the time to wait in seconds before terminating, default is 300 seconds or 5 minutes.
        for partition in UrlPartitions:
            partitionTasks: list = [create_task(GetRessource(url, session)) for url in partition]
            resultsList.append(await gather(*partitionTasks, return_exceptions=False))
    return(resultsList) # Or you can do more processing here before returning

async def main():
    urls: list = ["...", "...", "..."] # list of urls to get from
    results: list = await GetUrls(urls)
    print(results)

if __name__ == "__main__":
    run(main())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72340715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档