[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原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: 将一些东西封装到一个地方,你还可以取出来( ...
随机推荐
- SSH框架之Struts2第三篇
1.3相关知识点 : 1.3.1 OGNL的表达式 : 1.3.1.1 什么是OGNL OGNL是Object-Graph Navigation Language的编写,它是一种功能强大的表达式语言, ...
- C#中在多个地方调用同一个触发器从而触发同一个自定义委托的事件
场景 在Winfom中可以在页面上多个按钮或者右键的点击事件中触发同一个自定义的委托事件. 实现 在位置一按钮点击事件中触发 string parentPath = System.IO.Directo ...
- 架构视角 - DDD、TDD、MDD领域驱动、测试驱动还是模型驱动?
提出问题 「领域驱动设计」之于微服务,好比麦当劳之于汉堡(个人更喜欢肯德基,汉堡要大些,麦当劳的汉堡,想吃顿饱饭,请先给我上6个
- .netcore 中使用开源的AOP框架 AspectCore
AspectCore Project 介绍 什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect- ...
- python爬取网业信息案例
需求:爬取网站上的公司信息 代码如下: import json import os import shutil import requests import re import time reques ...
- localstorage实现两个页面通信,购物车原理。
如:A,B页面,A为商品页,B为购物车页,两个页面同时打开,在A页面点击商品添加至购物车,切换到B页面购物车怎么显示该商品信息 利用localStroage,A页面将数据存入localStroage, ...
- Cobalt Strike系列教程第四章:文件/进程管理与键盘记录
Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...
- MySQL基础之数据管理【4】
外键约束的使用(只有InnoDB存储引擎支持外键) create table news_cate( id tinyint unsigned auto_increment key comment '编号 ...
- Word List
周一考试了,单单单词查不完了,只好随便整理一下了
- Codeforces Round #603 (Div. 2)
传送门 感觉脑子还是转得太慢了QAQ,一些问题老是想得很慢... A. Sweet Problem 签到. Code /* * Author: heyuhhh * Created Time: 2019 ...