python 中 for 循环内的异步请求
Asynchronous requests inside the for loop in python
我有这个片段
config = {10: 'https://www.youtube.com/', 5: 'https://www.youtube.com/', 7: 'https://www.youtube.com/',
3: 'https://sportal.com/', 11: 'https://sportal.com/'}
def test(arg):
for key in arg.keys():
requests.get(arg[key], timeout=key)
test(config)
这样一来,事情就同步发生了。我想异步进行。我想遍历循环而不等待每个地址的响应并继续下一个。所以直到我遍历字典中的所有地址。比我想等到我得到所有地址的所有响应,然后再退出测试功能。我知道我可以用线程来做,但我读到 asyncio
lyb 可以做得更好,但我无法实现它。如果有人有更好的建议,我愿意接受。这是我的尝试:
async def test(arg):
loop = asyncio.get_event_loop()
tasks = [loop.run_in_executor(requests.get(arg[key], timeout=key) for key in arg.keys())]
await asyncio.gather(*tasks)
asyncio.run(test(config))
解决方法如下:
def addresses(adr, to):
requests.get(adr, timeout=to)
async def test(arg):
loop = asyncio.get_event_loop()
tasks = [loop.run_in_executor(None, addresses, arg[key], key) for key in arg.keys()]
await asyncio.gather(*tasks)
asyncio.run(test(config))
现在它与 lyb asyncio 同步工作,而不是与线程一起工作。
我有这个片段
config = {10: 'https://www.youtube.com/', 5: 'https://www.youtube.com/', 7: 'https://www.youtube.com/',
3: 'https://sportal.com/', 11: 'https://sportal.com/'}
def test(arg):
for key in arg.keys():
requests.get(arg[key], timeout=key)
test(config)
这样一来,事情就同步发生了。我想异步进行。我想遍历循环而不等待每个地址的响应并继续下一个。所以直到我遍历字典中的所有地址。比我想等到我得到所有地址的所有响应,然后再退出测试功能。我知道我可以用线程来做,但我读到 asyncio
lyb 可以做得更好,但我无法实现它。如果有人有更好的建议,我愿意接受。这是我的尝试:
async def test(arg):
loop = asyncio.get_event_loop()
tasks = [loop.run_in_executor(requests.get(arg[key], timeout=key) for key in arg.keys())]
await asyncio.gather(*tasks)
asyncio.run(test(config))
解决方法如下:
def addresses(adr, to):
requests.get(adr, timeout=to)
async def test(arg):
loop = asyncio.get_event_loop()
tasks = [loop.run_in_executor(None, addresses, arg[key], key) for key in arg.keys()]
await asyncio.gather(*tasks)
asyncio.run(test(config))
现在它与 lyb asyncio 同步工作,而不是与线程一起工作。