如何编写自己的python可等待函数,不仅调用其他异步函数?



我有一个阻塞函数:

def blocking_function():
doing.start_preparing()
while not doing.is_ready():
pass
return doing.do()

我想把它改成async函数

我读了一些asyncio的源代码,我发现了这两个选项:

@types.coroutine
def yield_option() -> typing.Generator:
doing.start_preparing()
while not doing.is_ready():
yield
return doing.do()
def future_and_call_soon_option() -> asyncio.Future:
doing.start_preparing()
loop = asyncio.get_running_loop()
future = loop.create_future()
def inner():
if not doing.is_ready():
loop.call_soon(inner)
else:
future.set_result(doing.do())
inner()
return future
async def main():
await asyncio.gather(yield_option(), future_and_call_soon_option()) #runs concurently
asyncio.run(main())

这两个选项都有效,但哪一个更好?或者有没有更好的第三种选择?

如何:

async def blocking_function():
doing.start_preparing()
while not doing.is_ready():
await asyncio.sleep(0)
return doing.do()

这将与其他任务协作。它很简单,如果阻塞函数足够快,在实践中可能是可以接受的。但是,如果阻塞函数占用大量时间,那么最好将它们移到另一个线程中。

最新更新