Python多进程下全局变量scoreres无法正确返回值的问题
问题原因
- 你使用
multiprocessing.Process创建子进程执行findBestMove,而Python多进程基于独立内存空间实现。 - 子进程会复制父进程的初始内存数据(包括
scoreres的初始值0),但子进程内对scoreres的修改完全局限在自身内存空间,不会同步到主进程的同名变量。 - 主进程调用
getNegaScore()时,读取的是自身内存中从未被修改的scoreres,因此始终返回0。
解决方案
方案1:使用进程间通信队列(推荐,适配你现有代码的return_queue)
修改ChessAI.py的findBestMove,将计算结果放入队列:
def findBestMove(var, var2, return_queue): next_move = None score = function(etc.) # 你的评分计算逻辑 return_queue.put(score) # 将结果存入队列
在ChessMain.py中等待子进程完成后从队列取结果:
from multiprocessing import Process, Queue return_queue = Queue() move_finder_process = Process(target=ChessAI.findBestMove, args=(game_state, valid_moves, return_queue)) move_finder_process.start() move_finder_process.join() # 等待子进程执行完毕 score = return_queue.get() # 从队列获取计算结果 print(score)
方案2:使用共享内存变量
若需保留全局变量形式,可通过multiprocessing.Value创建共享内存变量:
修改ChessAI.py:
from multiprocessing import Value # 初始化共享浮点变量,初始值0.0 scoreres = Value('d', 0.0) def findBestMove(var, var2, var3): global scoreres next_move = None score = function(etc.) with scoreres.get_lock(): # 加锁保证进程安全 scoreres.value = score def getNegaScore(): with scoreres.get_lock(): return scoreres.value
方案3:改用线程(适用于非CPU密集型任务)
如果findBestMove无大量CPU密集计算,可替换为threading.Thread,线程共享同一内存空间,全局变量修改会直接同步到主进程:
from threading import Thread move_finder_thread = Thread(target=ChessAI.findBestMove, args=(game_state, valid_moves, return_queue)) move_finder_thread.start() move_finder_thread.join() print(ChessAI.getNegaScore())
内容的提问来源于stack exchange,提问作者MarkdG
相关产品推荐
相关产品推荐

