提问人:lord_haffi 提问时间:6/5/2023 最后编辑:lord_haffi 更新时间:6/5/2023 访问量:25
使用 asyncio 框架时,同步函数是否需要锁保护?
Is Lock protection needed in synchronous functions when using asyncio framework?
问:
简而言之,我的问题是,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,这将立即执行吗?这样唯一阻挡的东西就是物体?Awaitable
Coroutine
Future
答: 暂无答案
评论
asyncio
async
async
await
asyncio
await