當前位置:成語大全網 - 新華字典 - 如何同步壹個python字典有多重

如何同步壹個python字典有多重

介紹

似乎有很多的扶手椅建議和沒有工作的例子。沒有列在下面,甚至多重的答案,這是頗有幾分失望和不安。由於python愛好者,我們應該支持我們的內置庫,並同時並行處理和同步從來都不是小事,我相信它可以制成瑣碎與適當的設計。這是很重要的現代多核架構,並且不能夠underline!話雖如此

CodeGo.net,我遠遠滿足多處理庫,它仍然是處於起步階段的階段與不少缺陷,錯誤,並正在面向函數式編程(我討厭)。目前我還是比較喜歡火焰兵模塊(這是遙遙領先其對多重的因無法在服務器運行時***享新創建的對象多處理的嚴重限制。“註冊”的管理對象只能實際註冊壹個對象之前管理(或服務器)開始數落夠了,更多的代碼:

Server.py

from multiprocessing.managers import SyncManager

class MyManager(SyncManager):

pass

syncdict = {}

def get_dict():

return syncdict

if __name__ == "__main__":

MyManager.register("syncdict", get_dict)

manager = MyManager(("127.0.0.1", 5000), authkey="password")

manager.start()

raw_input("Press any key to kill server".center(50, "-"))

manager.shutdown()

多重的SyncManager,可以提供同步***享對象的Server.py在上面的代碼示例。此代碼將不能工作在解釋多處理庫是如何找到“可贖回”為每個註冊的對象相當棘手的運行。運行Server.py將啟動壹個定制SyncManager***享多個進程的syncdict字典,並且可以連接到客戶端機或者機器上,或者,如果運行在比回環,其他機器的其他的IP地址。在這種情況下,服務器運行在環回(127.0.0.1)端口5000。操作syncdict當使用authkey使用安全連接。當任何壹個鍵被按下的管理是關機。

Client.py

from multiprocessing.managers import SyncManager

import sys, time

class MyManager(SyncManager):

pass

MyManager.register("syncdict")

if __name__ == "__main__":

manager = MyManager(("127.0.0.1", 5000), authkey="password")

manager.connect()

syncdict = manager.syncdict()

print "dict = %s" % (dir(syncdict))

key = raw_input("Enter key to update: ")

inc = float(raw_input("Enter increment: "))

sleep = float(raw_input("Enter sleep time (sec): "))

try:

#if the key doesn't exist create it

if not syncdict.has_key(key):

syncdict.update([(key, 0)])

#increment key value every sleep seconds

#then print syncdict

while True:

syncdict.update([(key, syncdict.get(key) + inc)])

time.sleep(sleep)

print "%s" % (syncdict)

except KeyboardInterrupt:

print "Killed client"

客戶端端還必須創建壹個自定義的SyncManager,註冊“syncdict”,這個沒有傳入壹個可調用來檢索***享字典。它定制到5000端口的環回IP地址(127.0.0.1)和authkey建立與管理的安全連接開始Server.py。它通過調用註冊的調用上的管理器檢索***享字典syncdict。它提示如下:

在syncdict的關鍵,操作上

該款項由鍵訪問時的值每個周期

在幾秒鐘內每個周期sleep的金額

然後,客戶端端會檢查看是否存在的關鍵。如果它不它創建的syncdict關鍵。然後,客戶端端進入壹個“沒完沒了”循環,它會更新密鑰的值由指定的金額sleep,並打印syncdict只是直到KeyboardInterrupt發生(CTRL

+C)重復此過程。

惱人的問題

該管理器啟動,否則妳會得到異常,即使在管理器中的目錄調用就會發現,它確實是有被註冊前管理人必須被調用。

該詞典的所有的操作壹定要做的,不是字典(syncdict [“爆破”]=2就會失敗的路多處理器***享自定義對象)

使用SyncManager的將減輕惱人的問題#2,除了惱人的問題#1防止由SyncManager.dict()被註冊和***享返回的代理。

(SyncManager.dict()只能被稱為後的管理器啟動,並註冊只會工作的管理開始之前這樣SyncManager.dict()是做函數式編程和通過代理進程作為壹個像文檔的例子做的時候)

在服務器和客戶端端必須註冊,即使直覺它會看起來像客戶端端將只能夠連接到管理後,看著辦吧(請添加到您的願望清單多處理開發人員)

閉幕

我希望妳喜歡這個相當徹底,稍有回答,就像我有。我有壹個很大的trouble直在我的腦海,為什麽我掙紮了這麽多的多處理模塊,其中火焰兵是壹件輕而易舉的,現在多虧了這個答案我已經擊中了要害。我希望這給如何提高多處理器模塊,因為我相信它有壹個很大的承諾,但處於起步階段達不到什麽是可能的。盡管描述的惱人的問題,我認為這仍然是壹個相當可行的替代方案,是非常簡單的。妳可以SyncManager.dict(),並把它傳遞給進程作為該文檔顯示方式,它很可能是壹個更簡單的解決方案,根據您的它只是感覺不自然

2.

有沒有字典需要被擺在首位***享的理由嗎?妳可以有每壹個線程維護自己的字典,並在線程處理或個別線程字典在壹起的回撥副本年底實例?

我不知道到底妳在做什麽,所以請我的,我的書面計劃可能無法正常工作壹字不差。什麽我的建議是更多的是壹種高層次的設計理念。

3.

我將致力於壹個單獨的進程,以維護“***享字典”:例如: xmlrpclib使代碼提供給其他進程少量,通過xmlrpclib如暴露壹個函數,該函數key, increment執行和壹個剛服用的key和返回值,用語義細節(是否有丟失的鑰匙,等,等壹個默認值),這取決於妳的應用程序的需求。

那麽妳任何妳喜歡的***享專用字典過程方法:從壹個簡單的字典壹個單線程的服務器壹直到壹個簡單的sqlite的數據庫,等等,等等,我建議妳開始與代碼“就這麽簡單,妳可以得到破除“(取決於妳是否需要壹個永久***享字典,或持久性是沒有必要給妳),和,如果需要優化。

4.

響應於適當的溶液中,以並行寫入的問題。我做了非常快速的研究,發現這篇文章是在暗示壹個鎖定/信號的解決方案。 (

雖然這個例子是不是特異性的壹本字典,我敢肯定,妳可以編寫壹個基於類的包裝對象,以幫助您基於這種想法詞典的工作。

如果我有壹個喜歡這個以線程安全的方式,我倒是Python的信號量解決方案。 (假設我的技術是行不通的。)我相信,信號量普遍放緩,由於其性質阻塞線程的效率。

從網站:

信號量是壹個比較先進的信號量有壹個內部的計數器,而不是壹個鎖標誌,並且它只有塊如果超過線程給定數量的試圖保持信號量。根據如何在信號量被初始化,這允許多個線程訪問代碼段

semaphore = threading.BoundedSemaphore()

semaphore.acquire() # decrements the counter

... access the shared resource; work with dictionary, add item or whatever.

semaphore.release() # increments the counter