Python でのマルチスレッドの経験を積もうとしています。これを行うためにゲームを使用していますが、奇妙な同期の問題が発生し、ゲームに非常に奇妙なバグが発生しています。以下は、関連するコードであると私が感じているものです(プロジェクトは500行で、すべてをオーバーロードしたくありませんでした)
UI の側面を制御し、コマンドをプレイヤー オブジェクトに渡すゲーム オブジェクトがあります。私の計画は、メインでプールを作成し、プールを processEvents() メソッドに渡して、プレーヤー/コンピューターが大規模なジョブに使用することでした。
import sys
from Player import Player
from AI import AI
from multiprocessing import Pool, cpu_count
class RTSGame(object):
def processEvents(self):
self.player.processEvents(self.ai.getShips(), pool)
self.ai.processEvents(self.player.getUnits(), pool)
#end processEvents
if __name__ == '__main__':
game = RTSGame()
pool = Pool(processes=cpu_count())
game.main()
最終的に、プール オブジェクトは次のようになります。
def findTarget(self, targets, pool):
'''
Returns the target best meeting the search criteria.
Currently just does closest. Will add criteria for strongest, weakest, or type.
'''
results = pool.map(findTargetHelper, map(lambda target: (self, target), targets))
shortest = min(results)
if shortest[0] < self.attackinfo.getRange():
return shortest[1] #return the ship at shortest distance
else:
return None #return nothing
''' Old Code
shortest = self.attackinfo.getRange() #You must be within the range of your weapons
shortestTarget = None
distfunc = self.getDistance
for target in targets:
dist = distfunc(self.position, target.getPosition())
if dist < shortest:
shortest = dist
shortestTarget = target
return shortestTarget
'''
#end findTarget()
def findTargetHelper(target): #target[0] is assumed to be the one searching for a target
return (target[0].getDistance(target[0].getPosition(), target[1].getPosition()), target[1])
findTargetHelper() は、このオブジェクトのメソッドではないことに注意してください (ピクルの問題を回避するため)。古いコードを使用すると問題なく動作しますが、大量のオブジェクトを扱うと少し時間がかかることがあります。
私の問題は奇妙です。オブジェクトが変更されているときは何も更新されていないようです (たとえば、攻撃によってダメージを受けることによって)。
これを機能させるために、コードに重要な何かが欠けていると思います。そして、これを使用できる他の領域があるため、これを機能させたいと考えています(たとえば、描画はCPUを集中的に使用します)。
編集:私はこれを理解しようとして多くの研究を行ってきました。私の研究は成功していません。私はあなたが与えることができる任意の助けをいただければ幸いです!