使用 asyncio 框架时,同步函数是否需要锁保护?

Is Lock protection needed in synchronous functions when using asyncio framework?

提问人:lord_haffi 提问时间:6/5/2023 最后编辑:lord_haffi 更新时间:6/5/2023 访问量:25

问:

简而言之,我的问题是,asyncio 框架究竟是如何执行代码的? 假设我有一些同步函数,它使用一些数据,例如在全局变量中。此上下文是完全同步的,没有 IO 操作。此函数将由其他一些函数调用,这些函数通常是异步的。 我现在的问题是:我是否需要在同步函数中使用 Lock(然后我必须使其异步)来保护例如全局变量的“共享”数据?

如果我理解正确的话,asyncio 框架会执行异步代码,直到它必须“等待”某些东西。但这意味着这个同步上下文将始终作为一个整体执行,因此不需要 保护,对吧?asyncio.Lock

例:

SHARED_MAP: dict[str, int] = {}

def get_entry(key: str) -> int:
    # Do I need to use a Mutex-Lock here?
    if key not in SHARED_MAP:
        SHARED_MAP[key] = randint(1, 10)

    return SHARED_MAP[key]

async def foo():
    # ...
    entry1 = get_entry("foo")
    await asyncio.sleep(0.1)
    entry2 = get_entry("bar")
    await asyncio.sleep(0.1)
    # ...

asyncio.run(foo())

我用 s 和昂贵的 arraycopy 操作搞砸了一点,但代码没有中断。因此,要么我不够好,无法破坏我的代码,要么 asyncio 确实在下一个 await 语句之前执行。asyncio.sleep

PS:如果我的猜测是正确的,并且 asyncio 一直执行到下一个 await 语句,那么一般可以说,如果 is a,这将立即执行吗?这样唯一阻挡的东西就是物体?AwaitableCoroutineFuture

python-asyncio 执行顺序

评论

0赞 Daniil Fajnberg 6/5/2023
你是对的。事件循环在单个线程中运行,因此,如果只有非函数访问共享资源,则不可能出现争用条件。在典型的 / 代码中,即使用(有一些特殊的库有自己的低级实现),允许上下文切换发生的唯一方法是到某物。asyncioasyncasyncawaitasyncioawait

答: 暂无答案


上一个:执行顺序混乱

下一个:等待多个未来?