分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net

当有多个线程,且它们同时访问同一资源时,需要考虑如何避免线程冲突。解决办法是使用线程锁。锁由Python的threading模块提供,并且它最多被一个线程所持有。当一个线程试图获取一个已经锁在资源上的锁时,该线程通常会暂停运行,直到这个锁被释放。看看下面的不具备锁功能的例子:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author: LiveEveryDayimport threadingtotal = 0def update_total(amount):global totaltotal += amountprint(total)if __name__ == '__main__':for i in range(10):my_thread = threading.Thread(target=update_total, args=(5,))my_thread.start()''' ------ Running Results ------
510
15
20
2530
354045
50
'''

如果往以上代码添加 time.sleep 函数并给出不同长度的时间,可能会让这个例子更有意思。无论如何,这里的问题是,一个线程可能已经调用 update_total 函数并且还没有更新完成,此时另一个线程也有可能调用它并且尝试更新内容。根据操作执行顺序的不同,该值可能只被增加一次。

给它添加锁后:

方式一:使用try/finally,确保锁肯定会被释放。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author: LiveEveryDayimport threadingtotal = 0
lock = threading.Lock()def update_total(amount):global totallock.acquire()try:total += amountfinally:print(total)lock.release()if __name__ == '__main__':for i in range(10):my_thread = threading.Thread(target=update_total, args=(5,))my_thread.start()''' ------ Running Results ------
5
10
15
20
25
30
35
40
45
50
'''

如上,在我们做任何处理之前就获取锁。然后尝试更新 total 的值,最后打印出 total 的当前值并释放锁。

方式二:with语句避免使用try/finally。

事实上,我们可以使用 Python 的 with 语句避免使用 try/finally 这种较为繁琐的语句:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author: LiveEveryDayimport threadingtotal = 0
lock = threading.Lock()def update_total(amount):global totalwith lock:total += amountprint(total)if __name__ == '__main__':for i in range(10):my_thread = threading.Thread(target=update_total, args=(5,))my_thread.start()''' ------ Running Results ------
5
10
15
20
25
30
35
40
45
50
'''

Python-线程锁的使用相关推荐

  1. python 线程锁 共享全局变量 线程通信

    python 线程锁 共享全局变量 线程通信 注意:全局变量不必做为参数传到函数里!!! import threading # 银行存钱和取钱 # 存钱1万次 def add():global mon ...

  2. php 线程锁,如何使用python线程锁(实例解析)

    在这篇文章之中我们来了解一下什么是python线程锁.了解一下python线程锁的相关知识,以及线程锁在python编程之中能起到什么样的作用. 线程锁(互斥锁Mutex) 一个进程下可以启动多个线程 ...

  3. python 线程锁_Python3多线程执行任务含线程同步锁

    Python启动多线程执行任务,用线程锁实现同步分配任务,最后等待所有线程执行完毕#python3多线程演示 import threading import random import time to ...

  4. python 线程锁_Python多线程-线程锁

    多线程修改一份数据时需要用到线程锁,以防止数据修改出错 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threa ...

  5. python线程锁和线程池

    线程锁 # 线程锁的代价是,失去异步效果 # db.txt文件内容:{"count": 1}from threading import Thread,Lock import tim ...

  6. [python] 线程锁

    参考:http://blog.csdn.net/kobeyan/article/details/44039831 1. 锁的概念 在python中,存在GIL,也就是全局解释器锁,能够保证同一时刻只有 ...

  7. python线程锁和进程锁

    在python的多线程和多进程中,当我们需要对多线程或多进程的共享资源或对象进行修改操作时,往往会出现因cpu随机调度而导致结果和我们预期不一致的问题,这时就需要对线程或者进程加锁,以保证一个线程或进 ...

  8. python 线程锁_python多线程编程(3): 使用互斥锁同步线程

    问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的 ...

  9. Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步

    主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...

  10. python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...

    GIL锁 ​ 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...

最新文章

  1. 为什么DL模型能够正确分类?SCOUTER(ICCV21')从“正”“反”方面说服你。
  2. python爬虫数据分析可以做什么-自学Python爬虫学到什么程度?就可以去找工作了?...
  3. 随机数排列JAVA_随机数生成器,按排序顺序
  4. python贪婪匹配和非贪婪匹配_贪婪匹配和非贪婪匹配
  5. HikariConfig配置详解
  6. http --- cookie与会话跟踪
  7. 《大型网站技术架构:核心原理与案例分析》-- 读书笔记 (2) : 大型网站核心架构要素(1) -- 性能...
  8. AngularJS控制器中的#39;this#39;与$ scope
  9. 图片md5值不一样_夏天宅家,拍点不一样的宝骏530车模图片!
  10. Knockout.Js官网学习(event绑定、submit绑定)
  11. Julia: 关于Array排序函数sortslices
  12. html背景图片自适应屏幕
  13. 金山反间谍清理专家能清除的部分恶意软件清单(截至2007年2月28日更新)
  14. VS2019 OpenCV安装与配置教程
  15. WPS添加带背景颜色的文本框
  16. 教程:使用EXCEL制作均值曲线图表
  17. 计算机软件使用前验证校准,ISO对计量器具管理要求
  18. 解决“远程主机被迫关闭了一个现有的连接”的问题
  19. project2016设置项目更新与监控方法
  20. 晶体硅太阳能电池产线性能跟踪项目

热门文章

  1. Flutter:手把手教你实现一个仿 Flipboard 图片3D翻转动画
  2. MacOS 如何删除启动时的客人用户?
  3. 2021转行做短视频运营可行吗
  4. python命令行输入函数回退_linux命令.
  5. JDBC知识点/第三部分使用PreparedStatement增删改查
  6. 北大荒农垦建边-农业大健康·李喜贵:功能农业谋定幸福麦田
  7. java网页制作总结报告_JSP 网页制作技巧总结
  8. android os 2.1,vivo Funtouch OS 2.1细节曝光 ,完美改造Android5.0
  9. 叉乘点乘混合运算公式_小学36年级必须掌握的数学公式和概念口诀,替孩子收藏一下!...
  10. PHP与redis队列实现电商订单自动确认收货