[英]Best way to communicate resource lock between processes
我有兩個 python 程序應該並行運行並做同樣的事情:
如您所見,最好讓兩個實例的執行以一種方式同步執行,其中一個執行需要大量處理器的步驟 1 和 2(實現是多線程的,因此 CPU 實際上可以最大化)而另一個執行I/O 繁重的第 3 步,反之亦然。
我的第一個想法是使用鎖文件,每個進程在進入階段 3 時獲取並在完成后釋放。 所以其他進程會一直等到鎖被釋放,然后在進入階段3的時候再設置。不過,這似乎是一種非常繁瑣的操作方式。 此外,系統應該在無人監督的情況下運行數天和數周,並能夠從錯誤、計划重啟或電源故障中恢復。 特別是在最后一種情況下,鎖定文件可以簡單地鎖定所有內容。
有沒有更優雅的方式來傳達兩個進程之間的鎖定? 還是我應該使用鎖定文件並嘗試實現一些智能清理功能以防止發生死鎖?
似乎每個解決方案都有一些缺點 - 某些機制或模塊並非在所有平台上都可用(即僅 Linux 或僅 Windows),或者您可能會遇到基於文件系統的方法的錯誤恢復問題(正如您已經指出的那樣在你的問題中)。
以下是一些可能選項的列表:
multiprocessing
模塊這允許您創建一個像這樣的鎖:
lock = multiprocessing.Lock()
並像這樣獲取和釋放它:
lock.acquire()
# do something
lock.release()
這是一個完整的例子。
優點:使用簡單; 跨平台; 錯誤恢復沒有問題。
缺點:由於您當前有兩個單獨的程序,因此您必須重新排列代碼以從同一個 python 模塊啟動兩個進程。
fnctl
(Linux) 對於 Linux/Unix 系統,有fcntl (帶有fcntl.flock()
)可用作 python 模塊。 這是基於鎖定文件的。
另請參閱此討論以及我在此處重復的一些建議:
缺點:不跨平台,僅適用於 Linux/Unix 系統。
posix_ipc
(Linux) 對於 Linux/Unix 系統, python_ipc (帶有Semaphore
類)可用作 python 模塊。
優點:不基於文件系統,沒有錯誤恢復問題。
缺點:不跨平台,僅適用於 Linux/Unix 系統。
msvcrt
(Windows) 對於 Windows 系統,有msvcrt (帶有msvcrt.locking()
)可用作 python 模塊。
另請參閱此討論。
缺點:不是跨平台的,僅在 Windows 系統上可用。
您可能需要查看以下 python 庫:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.