簡體   English   中英

在python中暫時釋放一個鎖(如果已持有)

[英]Release a lock temporarily if it is held, in python

我有一堆不應該同時運行的不同方法,因此我使用一個鎖來同步它們。 看起來像這樣:

selected_method = choose_method()
with lock:
    selected_method()

在這些方法中的某些方法中,有時我會調用一個執行一些緩慢的網絡IO的輔助函數。 (讓我們調用一個network_method() )。 我想在此函數運行時釋放鎖,以允許其他線程繼續其處理。

實現此目的的一種方法是在調用網絡方法之前和之后調用lock.release()和lock.acquire()。 但是,我寧願使方法不被鎖定,因為它們有很多而且它們隨時都在變化。

我更喜歡重寫network_method()以便它檢查是否持有該鎖,如果是,則在啟動之前將其釋放,最后再獲取它。

請注意,有時會從其他地方調用network_method() ,因此,如果它不在持有該鎖的線程上,則不應釋放該鎖。

我嘗試在Lock對象上使用locked()方法,但是該方法僅告訴我是否持有鎖,而不告訴我當前線程是否持有鎖。

順便說一句,鎖是一個全局對象,對此我很好。

我更喜歡重寫network_method(),以便它檢查是否持有該鎖,如果是,則在啟動之前將其釋放,最后再獲取它。

請注意,有時會從其他地方調用network_method(),因此,如果它不在持有該鎖的線程上,則不應釋放該鎖。

這聽起來完全是錯誤的事情:(

首先,根據您從何處調用某個函數有時會產生一些其他神奇的副作用是很不好的。 那是調試的噩夢。

其次,鎖應具有清晰的獲取和釋放語義。 如果我看寫的代碼是“ lock(); do_something(); unlock();” 那么我希望它在do_something()期間被鎖定。 實際上,這還告訴我do_something()需要鎖定。 如果我發現有人寫了一個特定的do_something()可以真正解鎖我剛剛看到的鎖,我將(a)發射它們或(b)使用武器追捕它們,具體取決於我是否在是否相對於他們有資歷。

順便說一句,鎖是一個全局對象,對此我很好。

順便說一句,這也是為什么全局變量不好的原因。 如果我修改一個值,調用一個函數,然后再次修改一個值,我不希望中間的那個函數能夠以一種無法預測的方式伸出援手並修改該值。

我對您的建議是:您的鎖在錯誤的位置,或做錯事,或兩者兼而有之。 您說這些方法不應該並發運行,但實際上您希望其中一些並發運行。 其中之一“很慢”的事實可能無法使人們滿意地刪除鎖-在這種類型的操作過程中您需要相互排斥才能使鎖正確,或者您不需要。 如果較慢的操作在本質上是安全的,而其他操作則不需要,則可能不需要該鎖-但這意味着該鎖應位於每個較快操作的內部,而不是外部。 但是,所有這些都取決於鎖的確切用途。

為什么不這樣做呢?

with lock:
    before_network()
do_network_stuff()
with lock:
    after_network()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM