[Python3] 线程安全的数据共享容器 List,Set,Dict

多个线程可以共享一个列表 (list),但要注意并发访问时可能引发的问题

文章目录

  • 线程安全的List
  • 线程安全的Set
  • 线程安全的 Dict

线程安全的List

  • 以下实现了一个行为类似list的类, 并且在多线程环境下安全
  • 这个类提供了与 list 类似的功能,同时确保了线程安全。这对于在多线程环境中使用列表而又避免数据竞争非常有用。
import threading

class ThreadSafeList:
    def __init__(self):
        self._list = []
        self._lock = threading.Lock()

    def append(self, item):
        with self._lock:
            self._list.append(item)

    def extend(self, items):
        with self._lock:
            self._list.extend(items)

    def insert(self, index, item):
        with self._lock:
            self._list.insert(index, item)

    def remove(self, item):
        with self._lock:
            self._list.remove(item)

    def pop(self, index=-1):
        with self._lock:
            return self._list.pop(index)

    def clear(self):
        with self._lock:
            self._list.clear()

    def index(self, item):
        with self._lock:
            return self._list.index(item)

    def count(self, item):
        with self._lock:
            return self._list.count(item)

    def sort(self, *, key=None, reverse=False):
        with self._lock:
            self._list.sort(key=key, reverse=reverse)

    def reverse(self):
        with self._lock:
            self._list.reverse()

    def __getitem__(self, index):
        with self._lock:
            if isinstance(index, slice):
                return self._list[index.start:index.stop:index.step]
            else:
                return self._list[index]

    def __setitem__(self, index, value):
        with self._lock:
            self._list[index] = value

    def __delitem__(self, index):
        with self._lock:
            del self._list[index]

    def __len__(self):
        with self._lock:
            return len(self._list)

    def __iter__(self):
        with self._lock:
            return iter(self._list.copy())

在这个 ThreadSafeList 类中:

  • 我们用 threading.Lock 来确保线程安全。
  • 大多数 list 方法都得到了实现,包括 appendextendinsertremovepopclearindexcountsortreverse 等。
  • __getitem____setitem__ 等方法也被实现,以支持索引和切片操作。
  • __iter__ 返回列表的副本,以防止迭代时出现竞争。

__iter__ 方法中,返回列表的副本是为了确保迭代过程中不受其他线程影响,因此使用浅拷贝(shallow copy)就足够了。

  • 浅拷贝会创建一个新的对象,该对象的内容与原始对象相同,但是内部元素的引用仍然指向原始对象中的元素。因此,如果对这些元素进行修改,原始对象和副本都会受到影响。
  • 但是在这种情况下,因为我们已经在__iter__方法中使用了锁来确保线程安全,所以在迭代过程中不会出现同时修改的情况,因此返回列表的浅拷贝就足够了。
  • 如果返回的是深拷贝(deep copy),则会完全复制原始列表及其内部元素,这可能会带来额外的开销,并且在这个情况下并不是必要的。

线程安全的Set

Python 的内置 set 对象本身并不是线程安全的。虽然个别操作(如添加和删除单个元素)可能在底层是原子性的,但多个线程同时操作 set 时可能会导致数据竞争或不一致的结果。因此,在多线程环境中同时操作 set 时,需要额外的同步机制来确保线程安全。

常见的实现方式包括:

  • 锁(Lock):使用 threading.Lock 来保护 set,确保在操作 set 时没有其他线程干扰。例如,将 set 的所有访问都包裹在 with 语句中使用锁。
  • 线程安全的集合:自己编写一个线程安全的集合类,类似于我之前示范的 ThreadSafeList。这个类将 set 的所有操作用锁来保护。

示例代码:

import threading

class ThreadSafeSet:
    def __init__(self):
        self._set = set()
        self._lock = threading.Lock()

    def add(self, item):
        with self._lock:
            self._set.add(item)

    def remove(self, item):
        with self._lock:
            self._set.remove(item)

    def discard(self, item):
        with self._lock:
            self._set.discard(item)

    def __contains__(self, item):
        with self._lock:
            return item in self._set

    def __iter__(self):
        with self._lock:
            return iter(self._set.copy())

在这个示例中,ThreadSafeSet 类使用 threading.Lock 来确保所有操作是线程安全的。我们使用浅拷贝来获取 set 的副本,以防止迭代期间的竞争。

总之,如果您在多线程环境中需要使用 set,建议使用锁或类似的同步机制来确保线程安全。

线程安全的 Dict

在 Python 3 中,原生的 dict 类型本身不是线程安全的。

虽然在读操作时通常不会出现问题,但在写操作(包括更新、删除和插入)时,多个线程同时操作一个 dict 对象可能导致数据不一致或引发竞争条件。

因此,建议在多线程环境中对 dict 对象的访问进行同步控制。

class ThreadSafeDict:
    def __init__(self):
        self._lock = threading.Lock()
        self._dict = {}

    def set(self, key, value):
        with self._lock:
            self._dict[key] = value

    def get(self, key, default=None):
        with self._lock:
            return self._dict.get(key, default)

    def delete(self, key):
        with self._lock:
            if key in self._dict:
                del self._dict[key]

    def keys(self):
        with self._lock:
            return list(self._dict.keys())

    def values(self):
        with self._lock:
            return list(self._dict.values())

    def items(self):
        with self._lock:
            return list(self._dict.items())

    def update(self, other):
        with self._lock:
            self._dict.update(other)

    def clear(self):
        with self._lock:
            self._dict.clear()

    def __getitem__(self, key):
        with self._lock:
            return self._dict[key]

    def __setitem__(self, key, value):
        with self._lock:
            self._dict[key] = value

    def __delitem__(self, key):
        with self._lock:
            del self._dict[key]

    def __contains__(self, key):
        with self._lock:
            return key in self._dict

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/601979.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vector介绍与使用【C++】

C vector 前言一、vector的介绍c文档介绍简介 二、vector的定义和使用vector的定义vector代码演示 vector的使用vector iterator 的使用vector 空间增长问题vector 增删查改vector 迭代器失效问题引起底层空间改变eraseg与vs检测比较string迭代器失效 vector 在OJ中的使用只出现…

四、 现行数据出境制度下的三条合规路径是什么?如何判断?

综合《网络安全法》《数据安全法》以及《个人信息保护法》这三大数据合规基本法律要求来看,企业开展数据出境活动时,应结合自身的主体类型、出境数据类型和数量,综合判断是否须要额外(1)申报并通过数据出境安全评估&am…

欧洲央行管委内格尔:通胀压力或将上升,未来利率水平可能保持相对高位

欧洲央行管委约阿希姆内格尔在本周二的一次讲话中表示,欧洲央行可能面临一系列潜在因素导致的通胀压力加大的情况。他指出,人口趋势可能导致持续较高的工资增长,并强调通胀率可能不会回到疫情前的低迷状态。 内格尔指出,考虑到全…

如何看待2024数维杯?

一、赛事介绍 美赛结束后,2024年又一场高含金量数模竞赛开始报名啦!数维杯每年上半年为数维杯国赛(5月,俗称小国赛),下半年为数维杯国际赛(11月),累计参赛高校千余所,参赛人数超14万人,经过八年多的发展,已成为继数学建模国赛和美赛之后的第三大全国性数学建模赛事,…

通义千问免费新功能:EMO,让照片和视频“活”起来

🧙‍♂️ 诸位好,吾乃斜杠君,编程界之翘楚,代码之大师。算法如流水,逻辑如棋局。 📜 吾之笔记,内含诸般技术之秘诀。吾欲以此笔记,传授编程之道,助汝解技术难题。 &#…

Git克隆仓库报错:HTTP/2 stream 1 was not closed

报错及原因 fatal: unable to access ‘https://github.com/xxx/’: HTTP/2 stream 1 was not closed cleanly before end of the underlying stream http/2 和 http/1.1之间有个区别是“HTTP2 基于 SPDY,专注于性能,最大的一个目标是在用户和网站间只…

国际数字影像产业园专场招聘会暨四川城市职业学院双选会成功举办

为了进一步强化校企合作,链接企业与高素质人才,促进毕业生实现高质量就业,2024年5月7日,“成就梦想 职通未来”国际数字影像产业园专场招聘会暨四川城市职业学院2024届毕业生校园双选会成功举行。 当天,国际数字影像产…

【建网护网三十载】 守护不息创新不止,C3安全AI未来!

30年,中国互联网从起步探索到领先全球。1994年4月20日,中国正式开通首条64K的国际专线,标志着我国成功实现与国际互联网的全功能接轨,展开互联网快速发展的三十载。 回望30年,亲历建网,投身建设&#xff0c…

yolov8任务之目标检测

对象检测 对象检测是一项涉及识别图像或视频流中对象的位置和类别的任务。对象检测器的输出是一组包围图像中对象的边界框,以及每个框的类标签和置信度分数。当您需要识别场景中感兴趣的对象,但不需要确切知道对象在哪里或其确切形状时,对象检…

RAG系统进阶

文本分割的粒度 缺陷 粒度太大可能导致检索不精准,粒度太小可能导致信息不全面问题的答案可能跨越两个片段 改进: 按一定粒度,部分重叠式的切割文本,使上下文更完整 from nltk.tokenize import sent_tokenize import jsondef split_text(…

Oracle-一次TX行锁堵塞事件

问题背景: 接用户问题报障,应用服务出现大量会话堆积现象,数据库锁堵塞严重,需要协助进行问题定位和排除。 问题分析: 登录到数据库服务器上,首先查看一下数据库当前的等待事件情况,通过gv$ses…

大学物理实验 期末复习笔记整理(个人复习笔记/侵删/有不足之处欢迎斧正)

一、误差和数据处理 1. 系统误差是指在重复性条件下,对同一被测量进行无限多次测量所得结果的平均值与被测量的真值之差。它通常是由于测量设备、测量方法或测量环境等因素引起的,具有重复性、单向性和可测性。而随机误差则是由于测量过程中一系列有关因…

WRT1900ACS搭建openwrt服务器小记

参考链接 wrt1900acs openwrt wrt1900acs openwrt 刷机 wrt1900acs原生固件刷openwrt-23.05.3-mvebu-cortexa9-linksys_wrt1900acs-squashfs-factory.img wrt1900acs openwrt更新刷openwrt-23.05.3-mvebu-cortexa9-linksys_wrt1900acs-squashfs-sysupgrade.bin 通过WEB UI来…

醛固酮(Aldosterone)/Aldosterone ELISA kit--比色竞争法酶免疫检测试剂盒

醛固酮(Aldosterone)是一种由肾上腺皮质中的胆固醇合成的类固醇激素。醛固酮在肾脏和肝脏中代谢,并作为控制钠钾平衡的关键盐皮质激素发挥作用。肾上腺合成和释放醛固酮主要受肾素-血管紧张素-醛固酮系统(RAAS)的调节&…

call, apply , bind 区别详解 及 实现购物车业务开发实例

call 方法: 原理 call 方法允许一个对象借用另一个对象的方法。通过 call,你可以指定某个函数运行时 this 指向的上下文。本质上,call 改变了函数运行时的作用域,它可以让我们借用一个已存 在的函数,而将函数体内的 th…

ISIS学习第一部分——isis基本概念

目录 一.ISIS与OSI模型 1.IS-IS,中间系统到中间系统 2.ES-IS,终端系统到中间系统 二.NET——ISIS中的“IP地址” (1)NET有3个部分: 1.Area ID 2.System ID 3.SEL (2).前面是可变长的,如何进行区分…

前端开发攻略---使用Sass调整颜色亮度,实现Element组件库同款按钮

目录 1、演示 2、实现原理 3、实现代码 1、演示 2、实现原理 改变颜色亮度的原理是通过调整颜色的 RGB 值中的亮度部分来实现的。在 Sass 中,可以使用颜色函数来操作颜色的 RGB 值,从而实现亮度的调整。 具体来说,亮度调整函数通常会改变颜…

使用 Docker 部署 TaleBook 私人书籍管理系统

1)项目介绍 GitHub:https://github.com/talebook/talebook Talebook 是一个简洁但强大的私人书籍管理系统。它基于 Calibre 项目构建,具备书籍管理、在线阅读与推送、用户管理、SSO 登录、从百度/豆瓣拉取书籍信息等功能。 友情提醒&#x…

ansible------inventory 主机清单

目录 inventory 中的变量 2)组变量[webservers:vars] #表示为 webservers 组内所有主机定义变量,所有组内成 员都有效 ansible_userrootansible_passwordabc1234 3) [all:vars…

前置知识储备

基本认知 什么是模式 在一定环境中解决一些问题的方案(通俗来说:特定环境中用固定的套路解决问题) 什么是设计模式 设计模式是一套反复被人使用,多数人知晓的,经过分类编目的代码设计经验的总结 设计模式最终的目…
最新文章