接着上篇多线程继续讲,上篇最后的多线程共享全局变量对变量的处理值出错在本文中给出解决方案。

出现这个情况的原因是在python解释器中GIL全局解释器锁。

GIL:全局解释器锁,每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程而已执行代码

线程释放GIL锁的情况:在IO操作等呃能会引起阻塞的system call之前,可以暂时释放GIL

但在执行完毕后,必须重新获取GIL, Python3中使用计时器(执行时间打到阀值后,当前线程释放GIL)

python使用多线程是并发 可以使用多线程利用多核的CPU资源

cpu密集型:也成为计算密集型,任务的特点是要进行大量的计算,消耗cpu资源,比如计算圆周率、对视频进行高清解码等等

全靠cpu的运算能力 这个时候单线程快

io密集型:涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成,因为 IO的速度远远低于CPU和内存的速度 这个时候多线程快。

那么如何解决多线程共享全局变量数据错误的问题呢,引入锁。

  1. import threading
  2.  
  3. a = 100
  4.  
  5. def func1():
  6. global a
  7. for i in range(1000000):
  8. meta.acquire() # 上锁
  9. a += 1
  10. meta.release() # 释放锁
  11. print(a)
  12.  
  13. def func2():
  14. global a
  15. for i in range(1000000):
  16. meta.acquire()
  17. a += 1
  18. meta.release()
  19. print(a)
  20.  
  21. # 创建锁
  22. meta = threading.Lock()
  23.  
  24. t1 = threading.Thread(target=func1)
  25. t2 = threading.Thread(target=func2)
  26. t1.start()
  27. t2.start()
  28. t1.join()
  29. t2.join()
  30. print(a)

至于锁的原理在下方粗略的画一张草图以供参考

使用锁让每个线程有序的切换执行,不会出现数据混乱。

但是在使用锁的时候要注意不要写出死锁代码,附死锁代码参考,总结一句就是互相持有对方线程所需要的锁,造成死锁

  1. import threading
  2.  
  3. a = 100
  4.  
  5. def func1():
  6. global a
  7. for i in range(1000000):
  8. meta_A.acquire() # 上锁
  9. meta_B.acquire() # 上多把锁 产生了死锁 看下面代码
  10. print('-------------1')
  11. a += 1
  12. meta_B.release()
  13. meta_A.release() # 释放锁
  14. print(a)
  15.  
  16. def func2():
  17. global a
  18. for i in range(1000000):
  19. meta_B.acquire()
  20. meta_A.acquire()
  21. print('------------2')
  22. a += 1
  23. meta_A.release()
  24. meta_B.release()
  25. print(a)
  26.  
  27. # 创建锁
  28. meta_A = threading.Lock()
  29. meta_B = threading.Lock()
  30.  
  31. t1 = threading.Thread(target=func1)
  32. t2 = threading.Thread(target=func2)
  33. t1.start()
  34. t2.start()

今天就写到这里,下一篇写一下队列

Python多线程同步互斥锁的更多相关文章

  1. C++11 多线程同步 互斥锁 条件变量

    在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,Linux下常见的线程同步的方法有下面几种: 互斥锁 条件变量 信号量 这篇博客只介绍互斥量和条件变量的使用. 互斥锁和条 ...

  2. 第十五章、Python多线程同步锁,死锁和递归锁

    目录 第十五章.Python多线程同步锁,死锁和递归锁 1. 引子: 2.同步锁 3.死锁 引子: 4.递归锁RLock 原理: 不多说,放代码 总结: 5. 大总结 第十五章.Python多线程同步 ...

  3. python多线程同步实例分析

    进程之间通信与线程同步是一个历久弥新的话题,对编程稍有了解应该都知道,但是细说又说不清.一方面除了工作中可能用的比较少,另一方面就是这些概念牵涉到的东西比较多,而且相对较深.网络编程,服务端编程,并发 ...

  4. python多线程threading.Lock锁用法实例

    本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...

  5. python多线程同步

    python多线程同步 作者:vpoet 日期:大约在夏季 import threading import time mylock = threading.RLock() num=0 class my ...

  6. 总结windows多线程同步互斥

    windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...

  7. windows多线程同步互斥--总结

    我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同步--临界区 windows多线程同步 ...

  8. Python 多线程同步队列模型

    Python 多线程同步队列模型 我面临的问题是有个非常慢的处理逻辑(比如分词.句法),有大量的语料,想用多线程来处理. 这一个过程可以抽象成一个叫“同步队列”的模型. 具体来讲,有一个生产者(Dis ...

  9. 多线程、互斥锁、异步、GIL

    多线程-threading python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便被使用 from threading imp ...

随机推荐

  1. Python 【基础常识概念】

    深浅拷贝 浅copy与deepcopy 浅copy: 不管多么复杂的数据结构,浅拷贝都只会copy一层 deepcopy : 深拷贝会完全复制原变量相关的所有数据,在内存中生成一套完全一样的内容,我们 ...

  2. Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置

    Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...

  3. CSS核心概念之盒子模型

    盒子模型(Box Model) 关于更多CSS核心概念的文章请关注GitHub--CSS核心概念. 当对一个文档进行布局的时候,浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型(CSS basi ...

  4. 【Win10】我们无法更新系统保留的分区

      前言 笔者是一个萌新,这个方案也是慢慢摸索出来的,有更好的方案欢迎大家提出 前段时间用公司电脑发现win10新版本还行,回家升级自己的电脑却提示“我们无法更新系统保留的分区”.(O_o)?? 笔者 ...

  5. Hadoop集群搭建(一)~虚拟机的创建

    Hadoop集群的搭建包括,虚拟机系统的安装:安装JDK,Hadoop:克隆虚拟机:伪分布式的搭建:安装zookeeper:Hive:Hbae:Spark等等: 我将分为多篇文章来记录.这篇文章主要写 ...

  6. 今天开dev的时候,config update一下别人的,但是忘了自己改过目录了,导致光看ip,想了半天,为什么接口不对

    今天开dev的时候,config update一下别人的,但是忘了自己改过目录了,导致光看ip,想了半天,为什么接口不对 baseUrl: {     //     // dev: 'http://1 ...

  7. Python第一周作业

    import turtle turtle.color('black','red') turtle.pensize(10) turtle.begin_fill() for i in range(5): ...

  8. Linux - top命令监控列表的详细解析

    统计信息区(系统资源信息区) 前五行,即列表上方的五行 第一行:输出系统任务队列信息 18:46:38:系统当前时间 up 2days 1:54:系统开机后到现在的总运行时间 1 user:当前登录用 ...

  9. jsp(3,6,9) EL表达式及JSTL

    1. jsp 1.1jsp是什么 全称: Java Server Pages,java服务器页面.和Servlet一样,是sun公司定义的一种动态网页开发技术.    特点:基于html模版,可以在h ...

  10. 什么是EIP、ESP、EBP

    堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表.允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称入栈和出栈.有一组CPU指令可以实现对进程的内存实现堆 ...