我正在尝试找出最佳方法,并不断就最佳方法提出不同意见。我有一个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
函数?