![](/img/trans.png)
[英]How to write your own async/awaitable coroutine function in Python?
[英]How to write your own python awaitable function that is not only calls other async functions?
我有一个阻塞 function:
def blocking_function():
doing.start_preparing()
while not doing.is_ready():
pass
return doing.do()
我想将其更改为异步 function。
我已经阅读了一些 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()
这将与其他任务合作。 如果阻塞函数足够快,它很简单并且在实践中可能是可以接受的。 但是如果阻塞函数需要大量时间,最好将它们移动到另一个线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.