首页 > 编程语言 >python-基础:线程

python-基础:线程

时间:2023-02-21 22:35:16浏览次数:39  
标签:count python t2 基础 number t1 threading 线程

3.线程安全

一个线程中可以有多个子线程,且线程可以共享进程中所有的资源

多个线程去操作一份资源,高概率性的发生数据混乱的情况,如下:

  • 示例
import threading

loop = 100000000
number = 0


def _add(count):
    global number
    for i in range(count):
        number += 1


def _sub(count):
    global number
    for i in range(count):
        number -= 1


t1 = threading.Thread(target=_add, args=(loop,))
t2 = threading.Thread(target=_sub, args=(loop,))
t1.start()
t2.start()
t1.join()
t2.join()

print(number)

结果不符合预期

  • 加入线程锁,解决“数据混乱”的问题

    import threading
    
    lock_object = threading.RLock()
    loop = 100000000
    number = 0
    
    
    def _add(count):
        lock_object.acquire()  # 加锁
        global number
        for i in range(count):
            number += 1
        lock_object.release()  # 释放锁
    
    
    def _sub(count):
        lock_object.acquire()  # 加锁
        global number
        for i in range(count):
            number -= 1
        lock_object.release()  # 释放锁
    
    
    t1 = threading.Thread(target=_add, args=(loop,))
    t2 = threading.Thread(target=_sub, args=(loop,))
    t1.start()
    # t1.join()主进程等待子进程
    # t1.setDaemo(Ture)主进程结束子进程
    t2.start()
    t1.join()
    t2.join()
    
    print(number)
    

    结果符合预期

  • with 上下文管理锁

    import threading
    
    lock_object = threading.RLock()
    loop = 100000000
    number = 0
    
    
    def _add(count):
        with lock_object: ##上下文管理
            global number
            for i in range(count):
                number += 1
    
    
    
    def _sub(count):
        with lock_object: ##上下文管理
            global number
            for i in range(count):
                number -= 1
    
    
    
    t1 = threading.Thread(target=_add, args=(loop,))
    t2 = threading.Thread(target=_sub, args=(loop,))
    t1.start()
    # t1.join()主进程等待子进程
    # t1.setDaemo(Ture)主进程结束子进程
    t2.start()
    t1.join()
    t2.join()
    
    print(number)
    
  • 线程安全的数据类型(内部集成了锁的机制)

    import threading
    
    lock_object = threading.RLock()
    data_list=[]
    
    def task():
        print('start')
        for i in range(100000000):
            data_list.append(i)
        print(len(data_list))
    
    for i in range(10):
        t=threading.Thread(target=task)
        t.start()
    

    以下操作为数据安全:

    L.append(x)

    L1.expend(L2)

    x=L(i)

    L1[i:j]=L2

    L.sort()

    x=y

    x.field=y

    D(x)=y

    D1.update(D2)

    D.keys()

    下面的不是数据安全

    i=i+1

    L.append(L[-1])

    L[i]=L[j]

    D(x)=D(x)+1

多注意开文档中是否表明为数据安全

标签:count,python,t2,基础,number,t1,threading,线程
From: https://www.cnblogs.com/xiaoleixiangqianchong/p/17142739.html

相关文章

  • springdata(jpa)的基础使用
    jpa与mybatis-plus类似,都属于数据库相关的框架 jpa需要扫描,这里在启动类指定路径  jpa的实体类需要绑定@Entity,与mysql表映射@Table(@name="数据库表名"),为主键......
  • python-requests出现InsecureRequestWarning错误
    使用Python3requests库发送HTTPS请求,verify=False已经关闭认证情况下,控制台会输出以下warning在代码中添加以下内容即可requests.packages.urllib3.disable_warnings()......
  • 1.7编程基础之字符串
    06:合法C标识符1.描述给定一个不包含空白符的字符串,请判断是否是C语言合法的标识符号(注:题目保证这些字符串一定不是C语言的保留字)。C语言标识符要求:1.非保留字;2.......
  • python+playwright 学习-5.new_context上下文与新窗口操作
    前言browser.new_context()创建一个新的浏览器上下文。它不会与其他浏览器上下文共享cookies/缓存。浏览器上下文使用browser.new_context()创建context对象,context......
  • JUC学习-线程池部分
    自定义线程池packagecom.appletree24;importjava.util.ArrayDeque;importjava.util.Deque;importjava.util.HashSet;importjava.util.concurrent.Exe......
  • QPython实例03-制作【ONE一个】可视化应用
    一、前言QPython3c在大佬的改进下,拥有了基于sl4a的FullScreenWrapper2全屏框架。文章将用该框架制作我们的可视化应用【ONE一个】。二、最终效果如下三、准备工作AI......
  • Python paramiko的简单使用
    paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方式。可以实现远程命令执行、文件传输、中间SSH代理等功能,相对于Pexpect,封装的层次更高,更贴近SSH协议的功......
  • python学习——【第十一弹】
    前言上一篇文章 ​​python学习——【第十弹】​​中介绍了python中类的相关属性和方法,这篇文章接着学习python中的浅拷贝,下一篇文章为大家介绍深拷贝。简单了解浅拷贝......
  • 【多线程】定位线程死锁
    定位线程死锁的方式jstackpid使用arthas写一个死锁的小例子importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.CountDownLatch;imp......
  • [Java基础]自动装箱与自动拆箱--为什么整型比较必须用equals?
    偶然在项目里看到了下面这行代码,大家觉得这个if判断会存在什么问题吗?if(129==StatusEnum.OK.getCode()){//其中OK是Integercode=129System.out.println("ok");......