簡體   English   中英

在進程之間通信資源鎖的最佳方式

[英]Best way to communicate resource lock between processes

我有兩個 python 程序應該並行運行並做同樣的事情:

  1. 從磁盤讀取和解壓縮數據(大約需要 1 分鍾)
  2. 處理數據(大約需要 2-3 分鍾)
  3. 將數據發送到數據庫(大約需要 3-5 分鍾)

如您所見,最好讓兩個實例的執行以一種方式同步執行,其中一個執行需要大量處理器的步驟 1 和 2(實現是多線程的,因此 CPU 實際上可以最大化)而另一個執行I/O 繁重的第 3 步,反之亦然。

我的第一個想法是使用鎖文件,每個進程在進入階段 3 時獲取並在完成后釋放。 所以其他進程會一直等到鎖被釋放,然后在進入階段3的時候再設置。不過,這似乎是一種非常繁瑣的操作方式。 此外,系統應該在無人監督的情況下運行數天和數周,並能夠從錯誤、計划重啟或電源故障中恢復。 特別是在最后一種情況下,鎖定文件可以簡單地鎖定所有內容。

有沒有更優雅的方式來傳達兩個進程之間的鎖定? 還是我應該使用鎖定文件並嘗試實現一些智能清理功能以防止發生死鎖?

似乎每個解決方案都有一些缺點 - 某些機制或模塊並非在所有平台上都可用(即僅 Linux 或僅 Windows),或者您可能會遇到基於文件系統的方法的錯誤恢復問題(正如您已經指出的那樣在你的問題中)。

以下是一些可能選項的列表:

使用 Python 的multiprocessing模塊

這允許您創建一個像這樣的鎖:

lock = multiprocessing.Lock()

並像這樣獲取和釋放它:

lock.acquire() 
# do something
lock.release() 

這是一個完整的例子。

優點:使用簡單; 跨平台; 錯誤恢復沒有問題。

缺點:由於您當前有兩個單獨的程序,因此您必須重新排列代碼以從同一個 python 模塊啟動兩個進程。

使用fnctl (Linux)

對於 Linux/Unix 系統,有fcntl (帶有fcntl.flock() )可用作 python 模塊。 這是基於鎖定文件的。

另請參閱此討論以及我在此處重復的一些建議:

  • 將鎖定進程的進程 ID 寫入文件,以便能夠識別和修復可能的死鎖。
  • 將鎖定文件放在臨時位置或 RAM 文件系統中。

缺點:不跨平台,僅適用於 Linux/Unix 系統。

使用posix_ipc (Linux)

對於 Linux/Unix 系統, python_ipc (帶有Semaphore類)可用作 python 模塊。

優點:不基於文件系統,沒有錯誤恢復問題。

缺點:不跨平台,僅適用於 Linux/Unix 系統。

使用msvcrt (Windows)

對於 Windows 系統,有msvcrt (帶有msvcrt.locking() )可用作 python 模塊。

另請參閱此討論

缺點不是跨平台的,僅在 Windows 系統上可用。

使用第三方庫

您可能需要查看以下 python 庫:

如果您遇到一些同步問題,我認為沒有比使用信號量更好的方法了。 您處理清理和鎖定部件的方式很大程度上取決於您的問題。 這類問題有很多資源。 Python 已經實現了一些原語

您可以查看此帖子以獲取示例。

還要檢查Zookeeper ,我從不在 python 上使用它,但它在其他語言中廣泛使用。

暫無
暫無

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

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