Python-线程锁的使用
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击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-线程锁的使用相关推荐
- python 线程锁 共享全局变量 线程通信
python 线程锁 共享全局变量 线程通信 注意:全局变量不必做为参数传到函数里!!! import threading # 银行存钱和取钱 # 存钱1万次 def add():global mon ...
- php 线程锁,如何使用python线程锁(实例解析)
在这篇文章之中我们来了解一下什么是python线程锁.了解一下python线程锁的相关知识,以及线程锁在python编程之中能起到什么样的作用. 线程锁(互斥锁Mutex) 一个进程下可以启动多个线程 ...
- python 线程锁_Python3多线程执行任务含线程同步锁
Python启动多线程执行任务,用线程锁实现同步分配任务,最后等待所有线程执行完毕#python3多线程演示 import threading import random import time to ...
- python 线程锁_Python多线程-线程锁
多线程修改一份数据时需要用到线程锁,以防止数据修改出错 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threa ...
- python线程锁和线程池
线程锁 # 线程锁的代价是,失去异步效果 # db.txt文件内容:{"count": 1}from threading import Thread,Lock import tim ...
- [python] 线程锁
参考:http://blog.csdn.net/kobeyan/article/details/44039831 1. 锁的概念 在python中,存在GIL,也就是全局解释器锁,能够保证同一时刻只有 ...
- python线程锁和进程锁
在python的多线程和多进程中,当我们需要对多线程或多进程的共享资源或对象进行修改操作时,往往会出现因cpu随机调度而导致结果和我们预期不一致的问题,这时就需要对线程或者进程加锁,以保证一个线程或进 ...
- python 线程锁_python多线程编程(3): 使用互斥锁同步线程
问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的 ...
- Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步
主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...
- python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...
GIL锁 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...
最新文章
- 为什么DL模型能够正确分类?SCOUTER(ICCV21')从“正”“反”方面说服你。
- python爬虫数据分析可以做什么-自学Python爬虫学到什么程度?就可以去找工作了?...
- 随机数排列JAVA_随机数生成器,按排序顺序
- python贪婪匹配和非贪婪匹配_贪婪匹配和非贪婪匹配
- HikariConfig配置详解
- http --- cookie与会话跟踪
- 《大型网站技术架构:核心原理与案例分析》-- 读书笔记 (2) : 大型网站核心架构要素(1) -- 性能...
- AngularJS控制器中的#39;this#39;与$ scope
- 图片md5值不一样_夏天宅家,拍点不一样的宝骏530车模图片!
- Knockout.Js官网学习(event绑定、submit绑定)
- Julia: 关于Array排序函数sortslices
- html背景图片自适应屏幕
- 金山反间谍清理专家能清除的部分恶意软件清单(截至2007年2月28日更新)
- VS2019 OpenCV安装与配置教程
- WPS添加带背景颜色的文本框
- 教程:使用EXCEL制作均值曲线图表
- 计算机软件使用前验证校准,ISO对计量器具管理要求
- 解决“远程主机被迫关闭了一个现有的连接”的问题
- project2016设置项目更新与监控方法
- 晶体硅太阳能电池产线性能跟踪项目
热门文章
- Flutter:手把手教你实现一个仿 Flipboard 图片3D翻转动画
- MacOS 如何删除启动时的客人用户?
- 2021转行做短视频运营可行吗
- python命令行输入函数回退_linux命令.
- JDBC知识点/第三部分使用PreparedStatement增删改查
- 北大荒农垦建边-农业大健康·李喜贵:功能农业谋定幸福麦田
- java网页制作总结报告_JSP 网页制作技巧总结
- android os 2.1,vivo Funtouch OS 2.1细节曝光 ,完美改造Android5.0
- 叉乘点乘混合运算公式_小学36年级必须掌握的数学公式和概念口诀,替孩子收藏一下!...
- PHP与redis队列实现电商订单自动确认收货