使用SQLite进行Python简单数据存储的线程安全解决方案

devtools/2024/9/18 12:09:42/ 标签: sqlite, python, 安全, ipython, 数据库, 开发语言

在 Python 中使用 SQLite 进行简单数据存储时,线程安全是一个需要注意的问题。SQLite 本身是线程安全的,但在多线程环境下,可能仍然需要做一些额外的工作来确保数据访问的安全性。

在这里插入图片描述

1、问题背景

一位开发者正在编写一个简单的聊天服务器和客户端,想要允许用户设置密码来保护他们的帐户。当用户想要启用密码保护时,他们可以通过发送 “/password ” 命令将帐户信息存储到 SQLite 数据库文件中,只有知道密码的用户才能使用该名称。

2、解决方案

由于 SQLite3 在 Python 中不是线程安全的,因此需要找到一种方法来安全地存储和管理数据。一种常见的解决方案是使用 multiprocessing.Manager() 模块,该模块提供了共享数据结构,可用于在不同的进程之间共享数据。

示例代码

python">import sqlite3
from multiprocessing import Manager# 创建一个共享管理器
manager = Manager()# 创建一个共享字典,用于存储用户帐户信息
user_accounts = manager.dict()# 在 SQLite 数据库文件中创建一个表
connection = sqlite3.connect('user_accounts.db')
cursor = connection.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS user_accounts (username TEXT PRIMARY KEY,password TEXT)''')
connection.commit()# 将用户帐户信息存储到 SQLite 数据库文件中
def store_user_account(username, password):connection = sqlite3.connect('user_accounts.db')cursor = connection.cursor()cursor.execute('''INSERT INTO user_accounts (username, password)VALUES (?, ?)''', (username, password))connection.commit()cursor.close()connection.close()# 从 SQLite 数据库文件中检索用户帐户信息
def retrieve_user_account(username):connection = sqlite3.connect('user_accounts.db')cursor = connection.cursor()cursor.execute('''SELECT password FROM user_accountsWHERE username = ?''', (username,))result = cursor.fetchone()cursor.close()connection.close()return result[0] if result else None# 使用共享字典存储用户帐户信息
def store_user_account_in_dict(username, password):user_accounts[username] = password# 从共享字典中检索用户帐户信息
def retrieve_user_account_from_dict(username):return user_accounts.get(username, None)# 使用 SQLite 数据库文件存储用户帐户信息
while True:# 等待用户输入username, password = input('Enter username and password: ').split()# 将用户帐户信息存储到 SQLite 数据库文件中store_user_account(username, password)# 从 SQLite 数据库文件中检索用户帐户信息password = retrieve_user_account(username)# 验证密码是否正确if password == password:print('Authentication successful.')else:print('Authentication failed.')# 使用共享字典存储用户帐户信息
while True:# 等待用户输入username, password = input('Enter username and password: ').split()# 将用户帐户信息存储到共享字典中store_user_account_in_dict(username, password)# 从共享字典中检索用户帐户信息password = retrieve_user_account_from_dict(username)# 验证密码是否正确if password == password:print('Authentication successful.')else:print('Authentication failed.')

上述示例中,提供了两个方法来存储用户帐户信息,一种是使用 SQLite 数据库文件,另一种是使用共享字典。使用 SQLite 数据库文件的方式可以提供更好的数据持久性,而使用共享字典的方式可以提高程序的性能。开发者可以选择根据自己的需求来选择合适的方法。

在多线程环境中使用 SQLite 时,最安全且推荐的方式是为每个线程创建独立的数据库连接,并确保这些连接仅用于该线程的操作。如果需要共享一个连接,可以使用显式的锁机制来保证线程安全。此外,使用 Queue 模式也是一种有效的策略,通过一个专用线程处理所有数据库操作,避免并发问题。


http://www.ppmy.cn/devtools/98426.html

相关文章

《通义千问AI落地—上》:后端接口

一、前言 本文源于微博客且已获授权,请尊重版权. 通义,由通义千问更名而来,是阿里云推出的语言模型 ,于2023年9月13日正式向公众开放。 属于(AI Generated Content,AIGC)领域, 是一个MaaS(模型即服务&#…

javaweb_10:XML映射文件

一、规范 1、XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放在相同的包下(同包同名)。 2、XML映射文件的namesapce属性为Mapper接口全限定名一致。 3、 XML映射文件中sql语句的id与Mapper接口中的方法名一致&a…

三个AI智能体开源项目:MetaGPT/AutoGPT/DB-GPT

三个AI智能体开源项目:MetaGPT/AutoGPT/DB-GPT (qq.com) MetaGPT以其元学习的能力,展现出自我优化的独特魅力;AutoGPT则以其自动化的特性,为编程领域带来了革命性的变革;而DB-GPT则在数据库管理领域,以其深…

kickstart自动安装脚本制作详解

一、kickstart自动安装脚本制作 此实验中,使用Rhel7.9,并开启图形化系统 1.设置实验环境 1.使用Rhel7.9 2.需要打开图形化系统 [rootpxe ~]# hostnamectl # 查看当前系统是否为图形化Static hostname: pxeIcon name: com…

认识HarmonyOS

HarmonyOS 三大特性 硬件互助,资源共享 把各终端硬件的能力,虚拟为一个共享的能力资源池,让应用通过系统,调用取其硬件能力。在这种架构下,硬件能力就像“活字印刷术”中的单词字母,可以被无限次的重复使用…

Epoll的实现原理

Epoll是Linux IO多路复用的一种IO管理机制。内核的实现代码在Linux内核源码的fs/eventpoll.c中。是比select和poll更高性能的一种IO管理机制。 前期准备 在实现epoll之前,要先了解内核epoll的运行原理。内核的epoll可以从四方面来理解。 Epoll 的数据结构&#xf…

如何应对突发技术故障和危机:开发团队的应急策略

开发团队如何应对突发的技术故障和危机? 在数字化时代,软件服务的稳定性对于企业至关重要。然而,即使是大型平台,如网易云音乐,也可能遇到突发的技术故障。网页端出现502 Bad Gateway 报错,且App也无法正常…

使用html-docx-js + fileSaver实现前端导出word

因为html-docx-js是16年的老库了,它代码里面用到的with语法现在严格模式不允许,用npm直接引入会报错,所以我们需要用其它方式引入 首先要将html-docx-js的代码放到项目中 html-docx-js/dist/html-docx.js at master evidenceprime/html-do…

java 环境安装

1, 下载jdk jdk-8u74-macosx-x64.dmg (jdk-8u20-macosx-x64.dmg) 2,配置环境变量 进入/Users/xxx vi ~/.bash_profile export JAVA_HOME/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home export PATH$JAVA_HOME/bin:$PATH:. export CLASSPATH$JAVA_HOME/…

React+TS+useReducer手撕一个todoList

1.首先需要具备TS的基础 附上链接:TS学习 这里也一并附上TS 官方文档地址:TS官方地址 2.项目学习视频,B站其他博主的视频 这里附上链接:ReactTSuseReducer手手撕一个todoList 3.项目地址,可以直接clone到本地运行 todoList项目 注意:项目有点bug,点击复选框的时候有问…

学懂C++(四十二):网络编程——RESTful API:概念、原理、核心点与 C++ 实现详解

目录 一、引言 二、RESTful 概念 1. 什么是 REST 2. RESTful API 概念 三、RESTful 与 HTTP 的联系与区别 1. 资源与 URL 2. HTTP 方法的使用 3. 无状态性 四、RESTful API 的核心原则 1. 资源标识(Resource Identification) 2. 表征&#xf…

生产者消息可靠性

若支付服务和mq之前网络链接失败/mq挂掉/交易服务挂掉,都有可以让支付订单无法更新,所以导致发送者不可靠,mq本身不可靠,消费者不可靠,消息延迟,针对以下问题 生产者可靠性 支付服务和mq之间有可能连不上,连不上怎么办,可以增加失败重连 配置文件中配置-重连 测试结果…

vue3 + tsx 实现音乐播放器

1、效果图 2、文件路径 3、调用方式 audioData为音频的相关数据,lrc为歌词原文(带时间的字符串),举个例子: const lrc [00:00.06]︿☆我不配☆︿ [au:]飒飒飒飒仨撒撒所所撒撒 [00:00.75] [00:01.11]演唱&#xff…

支持2.4G频秒变符合GB42590的标准的飞行器【无人机GB42590发射端】

使用方法: 放在飞机 上,按键那一面需要朝上对着天空(因为GPS陶瓷天线在按键面),支持基本ID,向量和系统包,电池容量240mAH充电1小时,使用时间大概2小时。 1.长按3秒开关机 2.开机红灯慢闪,只发射基本ID数据…

《机器学习》一元、多元线性回归的实现 No.4

一、一元线性回归实现 先直接看完整代码: import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegressiondate pd.read_csv(data.csv) #导入数据plt.scatter(date[广告投入],date[销售额]) # 用散点图展示数据 plt.sh…

java中的list对象,通过条件来检索某个对象的索引

在Java中,如果你有一个List对象,并且想要根据某个条件检索满足该条件的对象的索引,可以使用Stream API来实现。 下面是一个示例代码: import java.util.ArrayList; import java.util.List; import java.util.OptionalInt; import…

深入探索CSS的:local-link伪类:选择指向同一文档的链接

CSS(层叠样式表)是控制网页样式的核心语言,它允许开发者根据元素的不同状态和特性来应用样式。:local-link伪类是CSS中一个相对较少被讨论的选择器,它专门用于选择那些指向同一文档内锚点的链接。本文将详细介绍:local-link伪类的…

B2B⼤宗电商交易系统功能案例分析

B2B大宗电商交易系统是构建高效、安全、可扩展电子商务平台的重要基石。以下是对该系统后端架构与关键功能的详细解析: 后端架构 B2B大宗电商交易系统的后端架构通常涉及多个关键组件和技术,以确保系统的稳定运行和高效处理。主要组成部分包括&#xff…

数据结构初阶——算法复杂度超详解

文章目录 1. 数据结构前言1. 1 数据结构1. 2 算法 2. 算法效率2. 1 复杂度的概念 3. 时间复杂度3. 1 大O的渐进表示法3. 2 时间复杂度计算示例3. 2. 1 示例13. 2. 2 示例23. 2. 3 示例33. 2. 4 示例43. 2. 5 示例53. 2. 6 示例63. 2. 7 示例7 4. 空间复杂度4. 1 空间复杂度计算…

66 IPV4/6 OSPFV2/3 实操

一 网络括谱图 二 IPV6 一 华为IPV6地址的配置思路 1 全局上开启IPV6功能 # ipv6 # 2 在指定的接口上配置IPV6地址上的接口上配置IPV6地址 ipv6 enable 3 在接口上配置IPV6地址 ipv6 address 2001:1::254/64 脚本 # interface GigabitEthernet0/0/1 ipv6 enable ip add…