簡體   English   中英

如何編寫自己的 python awaitable function 即不僅調用其他異步函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM