我正试图在Python中获得一些多线程的经验。我正在使用游戏来做这件事,但我遇到了奇怪的同步问题,这在我的游戏中造成了非常奇怪的错误。以下是我认为的相关代码(该项目是500行,不想重载所有这些)
我有一个游戏对象,它控制UI的各个方面并将命令传递给玩家对象。我的计划是在main中创建池,并将池传递给我的播放器/计算机的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()不是此对象的方法(以解决pickleing问题)。使用我的旧代码时,它运行正常但可能需要花费一些时间来处理大量对象。
我的问题很奇怪。当对象被修改时(例如通过攻击造成伤害)似乎没有任何更新。
我认为我遗漏了一些对我的代码至关重要的事情。我想要这个工作,因为我还有其他方面可以使用它(例如,绘图是cpu密集型)。
编辑:我一直在做很多研究试图解决这个问题。我的研究没有成功。我很感激你能给予的任何帮助!