从Python多进程

时间:2017-05-10 19:34:46

标签: python multithreading python-3.x multiprocessing

我正在为游戏编写代码,AI以线程的形式运行。它们存储在包含相关信息的列表中,这样当它们的角色“死亡”时,只需将它们从活动AI列表中删除,就可以有效地将它们从游戏中删除。

控制它们的线程最初是从另一个线程中调用的,而控制播放器的tkinter窗口在主线程中运行 - 但是,AI线程导致主线程减速。在寻找降低创建AI的线程优先级的方法之后,我发现我必须使用multiprocessing.Process而不是threading.Thread,然后改变它的优点 - 但是当我尝试这样做时,AI线程不工作。运行此功能的函数在class AI()

中定义
def start():
    '''
    Creates a process to oversee all AI functions
    '''
    global activeAI, AIsentinel, done
    AIsentinel=multiprocessing.Process(target=AI.tick,args=(activeAI, done))
    AIsentinel.start()

def tick(activeAI, done):
    '''
    Calls all active AI functions as threads
    '''
    AIthreads=[]
    for i in activeAI:
        # i[0] is the AI function, i[1] is the character class instance (user defined)
        # and the other list items are its parameters.
        AIthreads.append(threading.Thread(name=i[1].name,target=lambda: i[0](i[1],i[2],i[3],i[4],i[5])))
        AIthreads[-1].start()
    while not done:
        for x in AIthreads:
            if not x.is_alive():
                x.join()
                AIthreads.remove(x)
                for i in activeAI:
                    if i[1].name==x.name:
                        AIthreads.append(threading.Thread(name=i[1].name,target=lambda: i[0](i[1],i[2],i[3],i[4],i[5])))
                        AIthreads[-1].start()

这些线程的输出应显示在stdout中,但是在运行程序时,什么都没有出现 - 我认为这是因为线程没有启动,但我不知道是不是因为它们的输出没有显示。我想要一种方法来使这个解决方案有效,但我怀疑这个解决方案太难看了,不值得修复,或者根本无法修复。

如果这种情况和我担心的一样可怕,我也会对这个问题的新方法持开放态度。

我在Windows 10计算机上运行它。提前谢谢。

编辑:

实际的print语句在另一个线程中 - 当AI执行一个动作时,它会向队列添加一个描述其动作的字符串,该队列由另一个线程打印出来(好像我没有足够的那些) 。举个例子:

battle_log.append('{0} dealt {1} damage to {2}!'.format(self.name,damage[0],target.name))

通过以下方式宣读:

def battlereport():
    '''
    Displays battle updates.
    '''
    global battle_log, done
    print('\n')
    while not done:
        for i in battle_log:
            print(i)
            battle_log.remove(i)

0 个答案:

没有答案