用排他锁来实现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)

如图:

四、测试结果

相关推荐
沐晓时光2 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
用户956256254295 小时前
跟做:Firecrawl 单页转 Markdown 再丢进沙箱总结
python·api
威哥爱编程6 小时前
模拟面试智能体开发实战 02:回答等半分钟,谁还愿意练?把服务端和流式输出搭起来
python·agent·harmonyos
威哥爱编程6 小时前
模拟面试智能体开发实战 01:面试挂了都不知道挂在哪?用 Python 给自己造一个随叫随到的 AI 面试官
python·agent·harmonyos
2601_967980116 小时前
Python行情API量化 02:顺序拉 20 要 2 秒?并发批量把时间压到 0.5 秒
python·api·限流·并发·量化
伞伞悦读6 小时前
【第81期】特征缩放怎么选:标准化、MinMax 与 Robust 的原理、泄漏对照和完整实验
人工智能·python·深度学习·机器学习
新*7 小时前
从一段 WebSocket 代码聊开:bytes 不是 zlib、binaryType 决定一切,15MB 大消息的零拷贝优化
javascript·python·websocket·性能优化·blob·zlib·arraybuffer
David猪大卫8 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
卷无止境9 小时前
mathmodel-figure-templates 以及两个上手案例
后端·python
fengci.9 小时前
CTF2MISC中等部分
开发语言·前端·学习