2009-10-19 125 views
7

我正在尋找一種方法來防止多個主機同時發出命令到Python XMLRPC偵聽器。偵聽器負責運行腳本以在該系統上執行任務,如果多個用戶同時嘗試發出這些命令,該任務將失敗。有沒有辦法阻止所有傳入的請求,直到單個實例完成?Python XMLRPC與併發請求

+1

客戶是否知道衝突矩陣?他們是否應該足夠聰明,按照這個矩陣來安排自己?他們的活動如何同步等... – jldupont 2009-10-19 15:19:42

+0

你使用SimpleXMLRPCServer,因爲我認爲這是單線程... – SeriousCallersOnly 2009-10-19 16:23:39

+0

我使用的是SimpleXMLRPCServer,但它似乎可以從不同的主機同時啓動相同的命令,這就是我需要防止 – MattB 2009-10-19 17:18:42

回答

15

我覺得Python SimpleXMLRPCServer模塊是你想要的。我相信該模型的默認行爲是在當前請求正在處理時阻止新的請求。默認行爲給了我很多麻煩,我通過在ThreadingMixIn類中混合來改變這種行爲,以便我的xmlrpc服務器可以在同一時間響應多個請求。

class RPCThreading(SocketServer.ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer): 
    pass 

如果我正確理解你的問題,SimpleXMLRPCServer是解決方案。只需直接使用它。

+0

+1,這是完美的! – 2009-10-21 10:48:12

0

你可以有另一個溝通渠道嗎?如果是的話,那麼在服務器和客戶端之間運行一個「輪到我回來時」的協議。

換句話說,每個客戶端都會註冊其向服務器發出請求的意圖,並且所述服務器在準備好時「回調」下一個客戶端。

+0

我不一定關心回撥客戶端,另外在防止由多個主機發出衝突命令 – MattB 2009-10-19 15:04:36

+0

您可以發回HTTP 5xx代碼(服務器忙或其他)嗎? – jldupont 2009-10-19 15:20:13

+0

什麼定義「衝突命令」? – jldupont 2009-10-19 15:33:01

0

有以下幾種選擇:

  1. 使用單進程,單線程服務器一樣SimpleXMLRPCServer隨後處理請求。在線程服務器中使用threading.Lock()
  2. 您在多進程服務器中有一些外部鎖定機制(如lockfile模塊或mysql中的GET_LOCK()函數)。