python - 多处理 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 每次都有不同的值,我也在使用多处理池,我的代码工作正常,它只是错误的计数器。
解决方案
即使成功案例无效,您也在设置标题。您还引用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))
推荐阅读
- javascript - 如何让我的星级评分累积和平均以生成整体产品评论?
- python - 带有来自 PyTesseract 的字符串的 IF 语句
- c++ - 在 boost intrusive 中使用存储桶的向量
- python - 无法在 ipyvuetify 的 Alert 对象中写入空格
- java - Java Discord JDA 移动用户
- azure-data-factory - 默认或阻止 ADF 管道活动参数
- java - 没有连接到 Tomcat 服务器
- c++ - 有没有办法使用 clang-format 来做“只缩进”?
- powershell - 使用 Invoke-Command 时 Powershell $PSScriptRoot 为空
- c++ - 如何在不知道数组大小的情况下将数组衰减到指针转换为向量?