首页 > 编程语言 >Python多线程如何保证数据安全

Python多线程如何保证数据安全

时间:2023-02-21 09:36:01浏览次数:40  
标签:Python t2 t1 threading num 数据安全 多线程

之前有一篇文章分享了有关Python多线程的一次基础语法以及GIL的相关概念,今天我们重点讲解多线程的数据安全问题。

数据安全问题

我们首先来举一个例子,这里定义两个函数,一个是自加1,一个时自减1,按正常的逻辑来说,最后这个值应该是0,但是程序每次运行的结果都不一样,有正数,也有负数。

import threading

num = 0


def add():
global num
for i in range(10000000):
num += 1


def sub():
global num
for i in range(10000000):
num -= 1


t1 = threading.Thread(target=add)
t2 = threading.Thread(target=sub)
t1.start()
t2.start()
t1.join()
t2.join()
print(num)

这就是多线程的数据安全的问题,我简单解释一下,因为线程会在两个函数中来回切换,好比在add函数中,刚准备加1时,程序被打断,跳到了sub函数中继续执行,这就会导致num值的改变。

我们举一个现实中的案例,很多人抢一张票,如果是多线程,当一个人在抢票时,突然切换到另外一个人买票,他买到了,然后又返回到第一个人,他这边还是显示的还有一张票,但其实后台已经没票了。

这时我们就可以手动加锁来解决这样的问题。

import threading

num = 0
lock = threading.Lock()


def add():
lock.acquire()
global num
for i in range(10000000):
num += 1
lock.release()


def sub():
lock.acquire()
global num
for i in range(10000000):
num -= 1
lock.release()


t1 = threading.Thread(target=add)
t2 = threading.Thread(target=sub)
t1.start()
t2.start()
t1.join()
t2.join()
print(num)

acquire函数就是申请锁,release就是释放锁,这样就能保证数据的安全。

今天的分享就到这了,我们下期再见~

标签:Python,t2,t1,threading,num,数据安全,多线程
From: https://www.cnblogs.com/q-q56731526/p/17139747.html

相关文章

  • python * 和 ** 的理解
    数学计算、获取参数、通配符数学计算乘法计算a*b立方计算a**b获取参数表示函数的可变参数例如func(*agr)实际调用可以在函数写入多个参数*func(a,b......
  • [oeasy]python0089_大型机的衰落_Dec小型机崛起_PDP_VAX网络
    编码进化回忆上次内容上次回顾了计算机存储单位的演变最小的读写单位是bit8-bit固定下来成为了字节(Byte)位数容量8-bit1Byte1024Byte......
  • Python 数据分析
    PrerequisitePS:只是做部分记录,具体的内容全记载在语雀,但不方便放出来NumPy是一个用于数值运算的Python库,专门对数值运算进行优化,最大的优势是运行高效。Matplotlib......
  • 在python中将4维数组中获取3维数组的方法
    在python中将4维数组中获取3维数组的方法得到了这个数组,它的大小是(26,16,16,16)。我需要绘制最后3个维度与不同参数的关系图,但我不清楚如何在不造成灾难的情况下切割第一个......
  • 2.1python认知
    2.1python认知####(1)python简介89年开发的语言,创始人范罗苏姆(GuidovanRossum),别称:龟叔(Guido).python具有非常多并且强大的第三方库,使得程序开发......
  • Python函数
    函数定义def函数名(参数列表):["注释块"](可选)语句块(代码块)return[返回值](可选)函数本身也是一个变量,该变量类型就是可调用类型,属性只读。参数列表和返......
  • python+playwright 学习-1.环境准备与快速开始
    前言说到web自动化,大家最熟悉的就是selenium了,selenium之后又出现了三个强势的框架Puppeteer、CyPress、TestCafe,但这3个都需要掌握JavaScript语言,所以只是少部分......
  • Python3.11 修改 pip 安装包安装位置
    操作步骤修改pip安装路径命令行输入pipconfigsetglobal.targetE:\DevEnv\Repository\Python\site-packages来修改pip安装包路径或者命令行输入py-mpipcon......
  • pip3 install opencv-contrib-python 会在Running setup.py bdist_wheel for opencv-p
    尝试1:pip的版本太低,升级了不行 尝试2:我用的豆瓣源,换成清华大学的,不行  尝试3:切换ubuntu原装python3.6.9的版本一、用miniconda;不行,整不了,piplist和我原来装的环......
  • python pip install numpy & scipy from repository tinghua
    python.exe-mpipinstall--upgradepippython-mpipinstall--upgradepippipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simple--upgradepippipinstal......