用排他锁来实现Python语言的变量值更新

一、背景

Python语言没有类似Java语言的volatile和AtomicBoolean、AtomicInteger等原子量接口。

因此:可以用排他锁来强制更新对象的属性,每次都是获取最新的结果。

二、主要代码

python 复制代码
import threading


# 原子整数值
class AtomicInteger:

    # 构造函数
    # value是整数
    def __init__(self, value: int = 0):
        # 保存最新变量值
        self.__value = value

        # 排他锁
        self.__lock = threading.Lock()

    # 更新值
    # nvalue是新值
    def update(self, nvalue):
        # 加锁
        self.__lock.acquire()

        # 更新值
        self.__value = nvalue

        # 解锁
        self.__lock.release()

    # 获取最新值
    def get(self):
        # 临时值
        temp = 0

        # 加锁
        self.__lock.acquire()

        # 获取最新值
        temp = self.__value

        # 解锁
        self.__lock.release()

        return temp


# 原子布尔值
class AtomicBoolean:

    # 构造函数
    # value是布尔值
    def __init__(self, value: bool = False):
        # 保存最新变量值
        self.__value = value

        # 排他锁
        self.__lock = threading.Lock()

    # 更新值
    # nvalue是新值
    def update(self, nvalue):
        # 加锁
        self.__lock.acquire()

        # 更新值
        self.__value = nvalue

        # 解锁
        self.__lock.release()

    # 获取最新值
    def get(self):
        # 临时值
        temp = False

        # 加锁
        self.__lock.acquire()

        # 获取最新值
        temp = self.__value

        # 解锁
        self.__lock.release()

        return temp

三、测试代码

python 复制代码
import atom
import threading
import time


# con是AtomicBoolean对象
def run(con):
    # 循环执行,遇到False为退出
    while con.get():
        print("打印")
        time.sleep(1)
    print("退出循环")
    

if __name__ == "__main__":
    # 定义原子变量
    con = atom.AtomicBoolean(True)

    # 创建线程
    th = threading.Thread(target=run, args=(con, ))

    # 启动线程
    th.start()

    # 阻塞输入
    k = input("输入任意字符退出:")
    if k:
        # 设置为假
        print("设置为假")
        con.update(False)

如图:

四、测试结果

相关推荐
笨鸟先飞,勤能补拙6 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
微学AI6 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
长和信泰光伏储能6 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
豆瓣鸡7 小时前
算法日记 - Day3
java·开发语言·算法
浦信仿真大讲堂7 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
韭菜炒鸡肝天7 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
Gu Gu Study7 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
Aaron - Wistron8 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
卷无止境8 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境8 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python