[b0031] python 归纳 (十六)_线程同步_锁
# -*- coding: utf-8 -*-
"""
学习 多线程同步 使用锁 threading.Lock()
逻辑:
2 个线程,操作同一个整型变量,一个加法,另外一个减法 总结:
1. 锁不是加在共享数据上,不像数据库锁加在数据上 ,好像是锁定修改数据的程序代码,任何时候,锁定的代码
最多被一个线程执行
2. 某段操作共享数据的代码加锁了,如果共享数据在代码其他地方有修改逻辑,没加锁
数据逻辑性无法保证
3. 锁获得,释放之间的代码可以不操作共享数据 ,仅仅实现线程之间的控制协调关系
4. 代码中可以使用多个锁,但是可能 造成死锁,相互等待对方的锁 有几个并发程序, 要不要操作共享数据,在代码哪里加锁,哪里释放锁。都要考虑进去
后 ,才能保证程序逻辑正确
操作共享数据, 应该 在所有修改数据的地方,加上同一把锁
读取数据的地方,根据逻辑,判断是否加上锁 使用:
1. 创建锁 lock = threading.Lock()
2. 在某段代码开始 获取锁 lock.acquire()
3. 在某段代码结束 释放锁 lock.release() 相关:
threading.RLock() """ import threading
import time lock = threading.Lock() # 锁
data = 0 # 共享数据 class Thread1(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item
def run(self):
print("begin",threading.currentThread().getName(),time.strftime('%M:%S',time.localtime(time.time())))
global data
lock.acquire() # 获取锁
time.sleep(2)
data += 1
print(threading.currentThread().getName(),data)
time.sleep(2)
data += 1
lock.release() # 释放锁
print(threading.currentThread().getName(),data)
print "\n","end",threading.currentThread().getName(),time.strftime('%M:%S',time.localtime(time.time())) class Thread2(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item
def run(self):
print("begin",threading.currentThread().getName(),time.strftime('%M:%S',time.localtime(time.time())))
time.sleep(1)
global data
lock.acquire() # 获取锁
time.sleep(2)
data -= 2
print(threading.currentThread().getName(),data)
time.sleep(2)
data -= 2
lock.release() # 释放锁
print(threading.currentThread().getName(),data)
print "\n","end",threading.currentThread().getName(),time.strftime('%M:%S',time.localtime(time.time())) t1 = Thread1(0)
t2 = Thread2(0) t1.start()
t2.start() t1.join()
t2.join() print "end" """
Out: ('begin', 'Thread-1', '35:47')
('begin', 'Thread-2', '35:47')
('Thread-1', 1)
('Thread-1', 2) end Thread-1 35:51
('Thread-2', 0)
('Thread-2', -2) end Thread-2 35:55
end
""" """
Thread2的锁操作注释掉
Out: ('begin', 'Thread-1', '36:29')
('begin', 'Thread-2', '36:29')
('Thread-1', 1)
('Thread-2', -1)
('Thread-1', 0) end Thread-1 36:33
('Thread-2', -2) end Thread-2 36:34
end
"""
Out1 保证 在操作共享数据的地方,执行完线程1,再执行线程2
Out2 即使在线程1中加了锁,但是线程2没有加锁,两个代码在同时跑。 数据一致性无法保证
[b0031] python 归纳 (十六)_线程同步_锁的更多相关文章
- [b0034] python 归纳 (十九)_线程同步_条件变量
代码: # -*- coding: utf-8 -*- """ 学习线程同步,使用条件变量 逻辑: 生产消费者模型 一个有3个大小的产品库,一个生产者负责生产,一个消费者 ...
- [b0032] python 归纳 (十七)_线程同步_信号量Semaphore
代码: # -*- coding: utf-8 -*- """ 多线程并发同步 ,使用信号量threading.Semaphore 逻辑: 多个线程,对同一个共享变量 , ...
- Python并行编程(六):线程同步之条件
1.基本概念 条件指的是应用程序状态的改变.其中某些线程在等待某一条件发生,其 他线程会在该条件发生的时候进行通知,一旦条件发生,线程会拿到共享资源的唯一权限. 2.示例代码 from threadi ...
- Python 爬虫十六式 - 第七式:正则的艺术
RE:用匹配来演绎编程的艺术 学习一时爽,一直学习一直爽 Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 pyquery 今天我们将迎来我们数据匹配部分的最后一位 ...
- Python 爬虫十六式 - 第五式:BeautifulSoup-美味的汤
BeautifulSoup 美味的汤 学习一时爽,一直学习一直爽! Hello,大家好,我是Connor,一个从无到有的技术小白.上一次我们说到了 Xpath 的使用方法.Xpath 我觉得还是 ...
- python lock, semaphore, event实现线程同步
lock 机制不管你是java, C#, 还是python都是常用的线程同步机制, 相比较C# 的锁机制, python的加锁显得比较简单, 直接调用threading 标准库的lock 就可以了. ...
- “全栈2019”Java多线程第十六章:同步synchronized关键字详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- python笔记10-多线程之线程同步(锁lock)
前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸 ...
- Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)
Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: 将一些东西封装到一个地方,你还可以取出来( ...
随机推荐
- TOMCAT 8.5 配置优化以及JVM配置(windows server)
下载官方的tomcat,我这里用的是TOMCAT 8.5.46,然后解压出来,解压后的目录如下图 一.server.xml配置优化 进入conf目录,打开server.xml 文件 1. 找到 < ...
- linux学习(十)Shell中的控制语句
目录 1. 条件测试语句 1.1 test语句 1.2[]语句 1.3文件测试 1.4字符串测试 1.5数值测试 1.5逻辑操作符 @(Shell中的控制语句) 1. 条件测试语句 测试语句十Shel ...
- Automatic Tuning of Undo Retention 常见问题 (Doc ID 1579779.1)
Automatic Tuning of Undo Retention Common Issues (Doc ID 1579779.1) APPLIES TO: Oracle Database - En ...
- linux环境搭配
1.linuxLinux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的Unix工具软件.应用程序和网络协议 ...
- express搭建后端请求路由,前端进行访问对应的接口 后端解决跨域
代码在 ==>E:\nodes实战\myserve\testserve 1 express搭建后端请求路由,前端进行访问对应的接口 1) 创建项目目录 express 项目名 -e 然后按照提示 ...
- fallowing-travelvue
1. 2.Header.vue 3.Swiper.vue . 4.Icons.vue 解决了上次轮播图--分页小圆点不显示的问题,本来以为图片应该都可以,结果换了轮播长图之后,小圆点听话的显示出啦 而 ...
- commons-httpclient 和 httpclient 区别
今天在看项目的pom的时候,发现里面有这么两个包依赖. <dependency> <groupId>commons-httpclient</groupId> < ...
- 【2019.10.7 CCF-CSP-2019模拟赛 T1】树上查询(tree)(思维)
思维 这道题应该算是一道思维题吧. 首先你要想到,既然这是一棵无根树,就要明智地选择根--以第一个黑点为根(不要像我一样习惯性以\(1\)号点为根,结果直到心态爆炸都没做出来). 想到这一点,这题就很 ...
- BERT-wwm、BERT-wwm-ext、RoBERTa、SpanBERT、ERNIE2
一.BERT-wwm wwm是Whole Word Masking(对全词进行Mask),它相比于Bert的改进是用Mask标签替换一个完整的词而不是子词,中文和英文不同,英文中最小的Token就是一 ...
- Linux服务器下配置Java环境、JDK
前言 可以解决问题有/etc/profile与~/.bashrc环境文件区别 文件权限问题,只读readonly Java环境搭建 一.下载JDK包 地址:jdk1.8提取码:gx0b 把文件放到Li ...