我有一个拦截功能:

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 ?

推荐答案

这样如何:

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

这将与其他任务相配合.它很简单,如果分块函数足够快,在实践中可能是可以接受的.但是,如果阻塞函数花费了大量时间,最好将它们移到另一个线程.

Python相关问答推荐

滚动和,句号来自Pandas列

未删除映射表的行

如何在polars(pythonapi)中解构嵌套 struct ?

NP.round解算数据后NP.unique

如何获取numpy数组的特定索引值?

如果条件不满足,我如何获得掩码的第一个索引并获得None?

Python—从np.array中 Select 复杂的列子集

在vscode上使用Python虚拟环境时((env))

如何在PySide/Qt QColumbnView中删除列

如何在两列上groupBy,并使用pyspark计算每个分组列的平均总价值

ConversationalRetrivalChain引发键错误

在numpy数组中寻找楼梯状 struct

如何将一组组合框重置回无 Select tkinter?

在电影中向西北方向对齐""

没有内置pip模块的Python3.11--S在做什么?

为什么我的scipy.optimize.minimize(method=";newton-cg";)函数停留在局部最大值上?

为什么按下按钮后屏幕的 colored颜色 保持不变?

为什么这个正则表达式没有捕获最后一次输入?

Pandas:新列,从列表中采样,基于列值

将多行数据循环到嵌套框架中的单行