我正在为游戏编写代码,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)