4

我正在尝试在 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() 不是该对象的方法(用于解决腌制问题)。使用我的旧代码时,它运行良好,但处理大量对象可能需要一些时间。

我的问题很奇怪。修改对象时似乎没有更新任何内容(例如通过攻击造成伤害)。

我认为我的代码中遗漏了一些重要的东西来完成这项工作。我希望它能够工作,因为我还有其他可以使用它的领域(例如,绘图是 cpu 密集型的)。

编辑:我一直在做很多研究试图弄清楚这一点。我的研究没有成功。我将不胜感激您能提供的任何帮助!

4

0 回答 0