我一直在尝试各种方法来使用一个asyncio循环嵌套在另一个asyncio循环中。但是大多数情况下我的测试都以错误结束,例如:
RuntimeError: This event loop is already running
下面是我起始的基本测试代码,您可以看到我正在尝试做什么。在这个测试之后,我尝试了很多东西,但是它们很混乱,所以我认为在寻求帮助时应该保持简单。如果有人能指导我正确的方向,那就太好了。感谢您的时间!
import asyncio
async def fetch(data):
message = 'Hey {}!'.format(data)
other_data = ['image_a.com', 'image_b.com', 'image_c.com']
images = sub_run(other_data)
return {'message' : message, 'images' : images}
async def bound(sem, data):
async with sem:
r = await fetch(data)
return r
async def build(dataset):
tasks = []
sem = asyncio.Semaphore(400)
for data in dataset:
task = asyncio.ensure_future(bound(sem, data))
tasks.append(task)
r = await asyncio.gather(*tasks)
return r
def run(dataset):
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(build(dataset))
responses = loop.run_until_complete(future)
loop.close()
return responses
async def sub_fetch(data):
image = 'https://{}'.format(data)
return image
async def sub_bound(sem, data):
async with sem:
r = await sub_fetch(data)
return r
async def sub_build(dataset):
tasks = []
sem = asyncio.Semaphore(400)
for data in dataset:
task = asyncio.ensure_future(sub_bound(sem, data))
tasks.append(task)
r = await asyncio.gather(*tasks)
return r
def sub_run(dataset):
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(sub_build(dataset))
responses = loop.run_until_complete(future)
loop.close()
return responses
if __name__ == '__main__':
dataset = ['Joe', 'Bob', 'Zoe', 'Howard']
responses = run(dataset)
print (responses)
sub_run()
从同步更改为异步吗? - Emerson Xusub_run
。 - user4815162342run()
中有许多同步函数调用,我们需要将所有同步函数转换为异步吗? - Emerson Xurun_in_executor
来执行传统的阻塞代码。 - user4815162342