我對Python很陌生,我正在研究一個多處理示例腳本。代碼大約100行,所以你可以在這裏找到它 - http://pastie.org/1813365進程間數據共享的問題
這是一個簡單的遊戲,發生在方形領域 - 他們被表示爲矩陣(列表包含x個x元素嵌套列表每個)。爲每個玩家創建一個單獨的遊戲區域。
我創建的每個過程都代表一個玩家。每輪和每個「玩家」,兩個座標和一個數字(0-9)生成(隨機)。每個「玩家」試圖將他的數字放在場地的座標上;如果在這些座標中的其他玩家的場地上沒有數字,或者這個數字小於第一個玩家的數字,或者如果第一個玩家有'0'(它就像'百搭卡') - 數字是(當然,應該是)放在兩個場上,並且球員的得分會增加。遊戲在指定次數的迭代後結束。
所有數據都存儲在包含數據的類的單個對象中,該對象正在從主線程傳輸到「第一個玩家」線程,然後不斷從一個線程傳輸到另一個線程,來回傳輸,直到比賽結束。 'JoinableQueue'正在被使用。
關於代碼的問題是,似乎每個「玩家」都有自己的兩個遊戲領域的副本。如果您每回合都從雙方都輸出兩個遊戲領域,您可以清楚地看到這一點 - 他們對於每個玩家都是相同的。例如,註釋行沒有任何影響,因爲其他玩家(正在打印在輪到他)字段絕不會被修改:
if x.data_PC[y2][x2] == 'X' or z2 == 0 or int(x.data_PC[y2][x2]) < z2:
x.data_PC2[y2][x2] = str(z2) # doesn't work
x.data_PC[y2][x2] = str(z2)
x.score_PC2 += 1
這是因爲在對象中的所有剩餘的數據尤其是陌生的似乎是工作得很好。
是什麼導致了這種行爲,我該如何解決這個問題?
爲什麼你首先使用多處理?面向對象的方法會使你的生活縮短很多。不僅如此......爲什麼你甚至會使用多處理來模擬由此導致的並且不是併發的回合制遊戲? – ktdrv 2011-04-19 22:54:22
因爲我需要創建一個使用多處理(或至少是多線程)的程序。實際上,對於學術貴族來說。這些條件(基於回合的遊戲,「爲了遊戲領域的資源而戰」等等)不是由我發明的。 :) – havelock 2011-04-19 22:57:01
我可能會將遊戲數據作爲共享狀態,並用鎖來控制轉動。這似乎比將遊戲狀態在隊列中來回傳遞更簡單。 http://docs.python.org/library/multiprocessing。html#sharing-state-between-processes – 2011-04-19 23:14:03