You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:45:37