此系列,已经推送的如下,还没看到的读者,可以走一波:

理解Python多线程4:代码稍作改动,bug就来了

理解Python多线程3:多线程抢夺同一个变量

理解Python多线程2:线程轮询得到CPU时间片的演示例子

理解Python多线程1:通过易懂的小例子展开

篇4说道一个Bug,今天就来修复:

篇5 加上一把锁,避免出现变量修改不同步的问题。

知道问题出现的原因后,要想修复问题,也没那么复杂。

通过python中提供的锁机制,某段代码只能单线程执行时,上锁,其他线程等待,直到释放锁后,其他线程再争锁,执行代码,释放锁,重复以上。

创建一把锁locka:

import threadingimport time

locka = threading.Lock()

通过 locka.acquire() 获得锁,通过locka.release()释放锁,它们之间的这些代码,只能单线程执行。

a = 0def add1():global atry:        locka.acquire() # 获得锁        tmp = a + 1        time.sleep(0.2) # 延时0.2秒,模拟写入所需时间        a = tmpfinally:        locka.release() # 释放锁    print('%s  adds a to 1: %d'%(threading.current_thread().getName(),a))

threads = [threading.Thread(name='t%d'%(i,),target=add1) for i in range(10)][t.start() for t in threads]

执行结果如下:

t0  adds a to 1: 1t1  adds a to 1: 2t2  adds a to 1: 3t3  adds a to 1: 4t4  adds a to 1: 5t5  adds a to 1: 6t6  adds a to 1: 7t7  adds a to 1: 8t8  adds a to 1: 9t9  adds a to 1: 10

一切正常,其实这已经是单线程顺序执行,就本例子而言,已经失去多线程的价值,并且还带来了因为线程创建开销,浪费时间的副作用。

程序中只有一把锁,通过 try...finally还能确保不发生死锁。但是,当程序中启用多把锁,还很容易发生死锁。

这么说,多线程的这种使用场合,就不妙了哦。那么,实际使用中,我该怎么办呢,python有没有更牛逼点的技术,提高类似场景的计算速度呢?

且看下篇,Python协程


轻触这里,给我留言

Python之路200个小例子,在线网页版来了,从此学习更方便!

Python小例子,长按关注

真诚奉献,从一而终

python 延时_理解Python多线程5:加锁解决问题,但又带来麻烦!相关推荐

  1. python 虚拟环境_理解Python虚拟环境

    什么是环境 既然有所谓的 虚拟环境(Virtual Environment),那么首先有必要解释一下,什么是环境. 这里的环境,指的就是 Python 代码的运行环境.它应该包含以下信息: Pytho ...

  2. python数据采集仪_数据采集卡支持python么深入理解Python生成器(Generator)

    我们可以通过列表生成式简单直接地创建一个列表,但是受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,而且如果我们仅仅需要访问前面几个元素,那后面绝大多 ...

  3. 第一章 第一节:Python基础_认识Python

    Python基础入门(全套保姆级教程) 第一章 第一节:Python基础_认识Python 1. 什么是编程 通俗易懂,编程就是用代码编写程序,编写程序有很多种办法,像c语言,javaPython语言 ...

  4. c++ 协程_理解Python协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  5. python3 协程 写法_理解Python的协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  6. python中元组_理解python中的元组

    理解 python 中的元组 引言 在 Python 中元组是这样的: 元组是是这样一种数据结构:不变的或者不可改变的(简单来说不能重新赋值) .元素的有序序列.因为元组是 不变的,所以他的数值是不能 ...

  7. 什么是python语言的动态类型机制_理解Python的Dynamic typing

    Python的Dynamic typing有些类似于C语言的指针,在C中,一个变量可以指向任何地址空间,在Python中,一个变量也可以指向任何type的数据对象.变量的指向可以在程序运行过程中变化, ...

  8. python在线搭建教程_理解python web开发,轻松搭建web app!

    大家好,今天分享给大家的是理解python web开发,轻松搭建web app,希望大家学有所获! 因为 python代码的优雅美观且易于维护这一特点,越来越多的人选择使用 Python做web开发. ...

  9. python 监测_理解监测指标,并使用Python去监测它们

    通过学习这些关键的术语和概念来理解 Python 应用监测. 当我***次看到术语"计数器counter"和"计量器gauge"和使用颜色及标记着"平 ...

最新文章

  1. React学习手记5-细说组件state
  2. hdu-acm steps FatMouse's Speed
  3. 【转载】redis开启远程访问
  4. Symantec SEP 端点防护[五]
  5. OJ8462-大盗阿福【各种dp之5】
  6. 结构体的传参理解成员的存储方式
  7. nginx日志中$request_time时间异常问题排查
  8. js获取某节点的特定父节点
  9. 立志做个有激情的coder
  10. 如何将妙控键盘连接到 Macbook?
  11. JSON与XML的综合比较
  12. 「python自动化运维」之自动生成配置文件并上传到目标服务器指定的位置
  13. C++万能头文件(真心佩服!)
  14. 基于Java开发的学校信息管理系统的设计与实现(含论文及毕业设计源码、数据库文件)
  15. Vue中实现页面截图并上传
  16. 《孤独的根号三》 中英文对照
  17. 做数据分析的36款常用工具!!!初学者必备,纯干货!!
  18. 3种CSS3实现的网页过度效果代码,可独立用于网页设计展示
  19. 玩家自述:遇到欠费请拨9电话骗局如何应对?
  20. 2021字节跳动校招秋招算法面试真题解题报告--leetcode148 排序链表,内含7种语言答案

热门文章

  1. Stateflow子状态激活条件下迁移有效
  2. 标星7000+,这个 Python 艺术二维码生成器厉害了!
  3. 终于来了!Python 编辑神器 Jupyter ,推出首款官方可视化 Debug 工具!
  4. Hadoop 生态系列之 1.0 和 2.0 架构
  5. 将本地代码上传到github中
  6. python中sklearn中的Imputer模块改动
  7. leetcode - 226. 翻转二叉树
  8. 中国餐馆过程(Chinese restaurant process)
  9. 摄影测量--内外方位元素
  10. Unity5 Sprite 图集打包 AssetBundle 更新探索