我有一个拦截功能:
def blocking_function():
doing.start_preparing()
while not doing.is_ready():
pass
return doing.do()
我想把它改成一个异步功能.
我读过一些Ayncio的源代码,我找到了这两个选项:
@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())
这两个选项都有效,但哪一个更好?或者,有没有更好的第三种 Select ?