簡體   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