使用池实现Python多处理

时间:2013-07-15 06:34:45

标签: python multiprocessing

我正试图在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密集型)。

编辑:我一直在做很多研究试图解决这个问题。我的研究没有成功。我很感激你能给予的任何帮助!

0 个答案:

没有答案