正确使用asycnio和请求的方法

时间:2019-05-08 15:00:49

标签: python python-requests python-asyncio concurrent.futures

我正在尝试找出最佳方法,并不断就最佳方法提出不同意见。我有一个ID列表,所有ID都需要附加到基本URL上,然后为每个URL发布GET请求。目前,我有这样的东西:

async def get_data():
    with ThreadPoolExecutor(max_workers=1) as executor:
        with requests.Session() as session:
            loop = asyncio.get_event_loop()
            tasks = [
                loop.run_in_executor(
                    executor,
                    fetch,
                    *(session, i)) for i in list(range(1, 201))
                ]
            for response in await asyncio.gather(*tasks):
                pass

fetch非常简单:

def fetch(session, i):
    url = "my.url.here"
    headers = {
        'Authorization': token,
        'Content-Type': 'application/json'
        }
    params = {'id': i}
    with session.get(url, headers=headers, params=params) as response:
        data = response.text
        return data

最后:

def main():
    loop = asyncio.get_event_loop()
    future = asyncio.ensure_future(get_data())
    loop.run_until_complete(future)

main()

我相信这是正确的方法。但是,我碰到过几篇文章说,为了开始会话,不使用requests而是使用requests-futures。基本上,我的问题是,我是否可以将ThreadPoolExecutor与常规requests.Session() as session一起使用?

此外,如果我切换为使用requests-futures,则可以在会话中调用ThreadPoolExecutor,如何使用该语法运行loop.run_in_executor函数?

0 个答案:

没有答案