首页 > 解决方案 > 多处理 ctypes.windll.kernel32.SetConsoleTitleW 计数器问题

问题描述

我有一个脚本,每次该函数由一个进程运行时,它都会设置一个控制台标题,我通过根据不同条件设置一个带有计数器的锁来做到这一点。因此,如果它是成功的,它将向成功计数器添加 +1。在我使用超过 2 个内核(这是我的笔记本电脑所拥有的)后,它似乎出现故障,它会开始倒数并在数字之间倒数第四。我认为设置一个锁可以解决这个问题,但显然不是。

#random code here
successlock = Lock()
successvalue = Value('i', 0)
#function starts here, locks and counters are defined outside the function
strin = "f"
if strin = "f":
    with successlock:
        successvalue.value+=1



ctypes.windll.kernel32.SetConsoleTitleW(str(successvalue.value))

显然 strin 每次都有不同的值,我也在使用多处理池,我的代码工作正常,它只是错误的计数器。

标签: pythonmultiprocessingctypes

解决方案


即使成功案例无效,您也在设置标题。您还引用successvalue了锁之外的内容。当两个线程同时设置标题时,它也会引发竞争条件。这或许可以解释为什么会发生回滚。

更好的解决方案是在锁定时设置标题。

#function starts here, locks and counters are defined outside the function
strin = "f"
if strin = "f":
    with successlock:
        successvalue.value+=1
        ctypes.windll.kernel32.SetConsoleTitleW(str(successvalue.value))

推荐阅读