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

Python多进程变量状态不共享:run变量修改未跨进程生效

多进程中全局变量无法同步的原因及解决办法

问题根源

你用multiprocessing创建的是独立进程,每个进程都有自己的内存空间。全局变量run会被复制一份到每个进程里,clickClaim里修改的只是当前进程的run副本,和mainScript进程里的run完全是两个独立变量,自然不会同步。global关键字只能作用于单个进程内的全局变量,跨进程完全无效。

两种可行解决方案

方案1:改用线程(threading)

线程共享同一进程的内存空间,全局变量可以直接同步,代码改动最小,适合游戏机器人这类IO密集型场景:

import threading
# 保留你原有的pyautogui、keyboard等导入

run = True

# 领取战利品
def clickClaim():
    global run
    while not keyboard.is_pressed('q'):
        if pyautogui.locateCenterOnScreen("Images/cl.png", confidence=.8):
            run = False
            sc.sac("Images/cl.png", 0.1)
            pyautogui.click(960, 500)
            pyautogui.click(960, 500)
            run = True

# 当run为True时执行长按操作
def mainScript():
    clicked = False
    while not keyboard.is_pressed('q'):
        global run
        if run and not clicked:
            pyautogui.mouseDown(1200, 500)
            print("Mouse is Down")
            clicked = True
        elif not run and clicked:
            pyautogui.mouseUp()
            print("Mouse Is Up")
            clicked = False

mainS = threading.Thread(target=mainScript)
bgClaim = threading.Thread(target=clickClaim)

if __name__ == '__main__':
    bgClaim.start()
    mainS.start()

方案2:用多进程共享变量(如果必须用多进程)

通过multiprocessing.Value创建跨进程共享的变量,确保两个进程操作的是同一个值:

import multiprocessing
# 保留你原有的pyautogui、keyboard等导入

# 创建布尔型共享变量,初始值为True
run = multiprocessing.Value('b', True)

# 领取战利品
def clickClaim(run):
    while not keyboard.is_pressed('q'):
        if pyautogui.locateCenterOnScreen("Images/cl.png", confidence=.8):
            run.value = False
            sc.sac("Images/cl.png", 0.1)
            pyautogui.click(960, 500)
            pyautogui.click(960, 500)
            run.value = True

# 当run为True时执行长按操作
def mainScript(run):
    clicked = False
    while not keyboard.is_pressed('q'):
        if run.value and not clicked:
            pyautogui.mouseDown(1200, 500)
            print("Mouse is Down")
            clicked = True
        elif not run.value and clicked:
            pyautogui.mouseUp()
            print("Mouse Is Up")
            clicked = False

mainS = multiprocessing.Process(target=mainScript, args=(run,))
bgClaim = multiprocessing.Process(target=clickClaim, args=(run,))

if __name__ == '__main__':
    bgClaim.start()
    mainS.start()

总结

  • 游戏机器人这类以IO操作为主的任务,用线程更简单,无需额外处理共享状态。
  • 如果必须用多进程,就用multiprocessing提供的共享变量(如Value、Array)来同步状态。

内容的提问来源于stack exchange,提问作者DrunkGuy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:15:12