python - 在异步方法开始之前获取锁
问题描述
假设我有一个multiprocessing.Lock
实例(lock
如下),我想在协程实际开始运行之前获取foo
它(比如说它是由一些未来的 I/O 或信号触发的,所以我不想在整个期间持有锁它被阻塞了,而只是在它运行时。)有没有办法在不修改foo
自身主体的情况下做到这一点?为了显示:
无锁:
await foo()
带锁:
lock.acquire()
await foo()
lock.release()
foo
据我所知,将其包装在另一个函数中无济于事,async
因为它仍然需要以await
相同的方式进行编辑。直接处理也无济于事asyncio.Future
,因为我所能做的就是add_done_callback
. 或者任何其他“链接”回调的概念与将其包装在一个async
函数中相同——如果我将获取锁的未来放在未来之前foo
,它将立即有效地运行,并且锁将在整个持续时间内被持有,直到foo
实际开始。
是改变身体foo
的唯一方式还是有我没有看到的解决方法?
更具体地说,以防万一,我的情况实际上foo
是实例的get
方法。asyncio.Queue
因此,用两行方法子类化并覆盖这个单行方法可能就足够了,它首先完成我想要的锁获取。或者monkeypatch实例上的方法。但这似乎进入了丑陋的领域。
解决方案
评论后更新。
一般来说,在使用锁时,您应该尽可能短地持有它们。
如果您需要使用锁,则编写子类可能是要走的路。
您的问题没有包含足够的细节来提供其他明智的建议。
推荐阅读
- django - 如何修复阻止具有来源“https://s3.amazonaws.com”的框架访问跨域框架
- laravel - 我需要帮助在 Laravel 中制作三向数据透视表并显示输出
- selenium - 验证 selenium ide 中的颜色
- javascript - 如何解决 JavaScript 引用错误(命令未定义)?
- php - 使用带有 ImageMagick 的 HALD CLUT 时出错(输出图像上有黑线)
- html - 按类将转换属性添加到现有转换属性
- sql - 我可以使用调整大小的模型进行部分选择吗?
- python - 类型错误:get() 缺少 1 个必需的位置参数:'index1'
- c - xdotool 选项的问题
- python - 进程不加入多处理python