将任务添加到运行循环中并运行直到完成



我有一个从没有awaitasync函数调用的函数,并且我的函数需要调用async函数。我可以对asyncio.get_running_loop().create_task(sleep())这样做,但是在顶层的run_until_complete直到新任务完成才运行。

如何让事件循环运行直到新任务完成?

我不能让我的函数async,因为它没有被await调用。

我不能改变futuresleep。我只控制in_control

import asyncio

def in_control(sleep):
"""
How do I get this to run until complete?
"""
return asyncio.get_running_loop().create_task(sleep())

async def future():
async def sleep():
await asyncio.sleep(10)
print('ok')
in_control(sleep)

asyncio.get_event_loop().run_until_complete(future())

看来nest_asyncio包将在这里帮助您。我还在示例中包含了获取任务的返回值。

import asyncio
import nest_asyncio

def in_control(sleep):
print("In control")
nest_asyncio.apply()
loop = asyncio.get_running_loop()
task = loop.create_task(sleep())
loop.run_until_complete(task)
print(task.result())
return

async def future():
async def sleep():
for timer in range(10):
print(timer)
await asyncio.sleep(1)
print("Sleep finished")
return "Sleep return"
in_control(sleep)
print("Out of control")

asyncio.get_event_loop().run_until_complete(future())

结果:

In control
0
1
2
3
4
5
6
7
8
9
Sleep finished
Sleep return
Out of control
[Finished in 10.2s]