[英]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
的主体是唯一的方法还是有我没有看到的解决方法?
更具体一点,以防万一,我的情况实际上是foo
是asyncio.Queue
实例的get
方法。 因此,将这个单行方法子类化并用一个两行方法覆盖它可能就足够了,该方法首先执行我想要的锁获取。 或者 monkeypatch 实例上的方法。 但这似乎进入了丑陋的领域。
评论后更新。
通常,在使用锁时,您应该将它们持有的时间尽可能短。
go如果需要用到锁的话,写个子类大概是个办法。
您的问题没有包含足够的细节来提供其他明智的建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.