繁体   English   中英

在异步方法开始之前获取锁

[英]Acquiring a lock just before an async method starts

假设我有一个multiprocessing.Lock实例(下面的lock ),我想在协程foo实际开始运行之前获取它(假设它是由某些未来的 I/O 或信号触发的,所以我不想持有在它被阻塞的整个期间锁定,而不是在它运行时锁定。)有没有办法在不修改foo本身的主体的情况下做到这一点? 为了显示:

无锁:

await foo()

带锁:

lock.acquire()
await foo()
lock.release()

据我所知,将foo包装在另一个async function 中没有帮助,因为它仍然需要以相同的方式await 直接处理asyncio.Future也无济于事,因为我所能做的就是add_done_callback 或者“链接”回调的任何其他概念与将其包装在async函数中是一样的——如果我将锁获取未来放在foo未来之前,它将立即有效地运行,并且锁将一直持有直到foo真正开始的持续时间。

改变foo的主体是唯一的方法还是有我没有看到的解决方法?


更具体一点,以防万一,我的情况实际上是fooasyncio.Queue实例的get方法。 因此,将这个单行方法子类化并用一个两行方法覆盖它可能就足够了,该方法首先执行我想要的锁获取。 或者 monkeypatch 实例上的方法。 但这似乎进入了丑陋的领域。

https://github.com/python/cpython/blob/1e1dbdf23f7a18f53a3257badc3541973831f2c4/Lib/asyncio/queues.py#L57-L58

评论后更新。

通常,在使用锁时,您应该将它们持有的时间尽可能短

go如果需要用到锁的话,写个子类大概是个办法。

您的问题没有包含足够的细节来提供其他明智的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM