# -*- 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 归纳 (十六)_线程同步_锁的更多相关文章

  1. [b0034] python 归纳 (十九)_线程同步_条件变量

    代码: # -*- coding: utf-8 -*- """ 学习线程同步,使用条件变量 逻辑: 生产消费者模型 一个有3个大小的产品库,一个生产者负责生产,一个消费者 ...

  2. [b0032] python 归纳 (十七)_线程同步_信号量Semaphore

    代码: # -*- coding: utf-8 -*- """ 多线程并发同步 ,使用信号量threading.Semaphore 逻辑: 多个线程,对同一个共享变量 , ...

  3. Python并行编程(六):线程同步之条件

    1.基本概念 条件指的是应用程序状态的改变.其中某些线程在等待某一条件发生,其 他线程会在该条件发生的时候进行通知,一旦条件发生,线程会拿到共享资源的唯一权限. 2.示例代码 from threadi ...

  4. Python 爬虫十六式 - 第七式:正则的艺术

    RE:用匹配来演绎编程的艺术 学习一时爽,一直学习一直爽   Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 pyquery 今天我们将迎来我们数据匹配部分的最后一位 ...

  5. Python 爬虫十六式 - 第五式:BeautifulSoup-美味的汤

    BeautifulSoup 美味的汤 学习一时爽,一直学习一直爽!    Hello,大家好,我是Connor,一个从无到有的技术小白.上一次我们说到了 Xpath 的使用方法.Xpath 我觉得还是 ...

  6. python lock, semaphore, event实现线程同步

    lock 机制不管你是java, C#, 还是python都是常用的线程同步机制, 相比较C# 的锁机制, python的加锁显得比较简单, 直接调用threading 标准库的lock 就可以了. ...

  7. “全栈2019”Java多线程第十六章:同步synchronized关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. python笔记10-多线程之线程同步(锁lock)

    前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸 ...

  9. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

随机推荐

  1. Java - java概述

    简介: JAVA是一门面向对象的编程语言 1995有sun公司发布 java程序执行流程: xxxjava源文件, 经过编译器编译 产生字节码文件 字节码交给解释器 解释成当前平台的本地机器指令 名词 ...

  2. vscode解决nuget插件不能使用的问题

    错误提示 使用vscode安装nuget插件之后出现错误: "Versioning information could not be retrieved from the NuGet pac ...

  3. SQLi-LABS Page-3 (order by injections) Less-46-Less-53

    关于order by 注入原理讲解 注入原理 1. 测试 ?sort=1 desc--+?sort=1 asc--+ 显示结果不同,说明可以注入 desc是 descend 降序意思 asc 是 as ...

  4. Command CompileSwiftSources failed with a nonzero exit code

    Xcode错误提示:Command CompileSwiftSources failed with a nonzero exit code,网上找了好多才搞定,通过在Build Setting里面自添 ...

  5. Linux下使用 github+hexo 搭建个人博客07-next主题接入搜索和站点管理

    这是搭建个人博客系统系列文章的最后一篇,如果你是从第一篇一路跟下来的,那么恭喜你,即将完成整个博客网站的搭建.OK,话不多说,开始我们的收官之战. 不知你想过没有,如果我们的文章少,一眼看完整个目录, ...

  6. linux学习(八)Shell中变量的数学运算

    目录 常见的运算符 expr命令 @(Shell中变量的数学运算) 常见的运算符 环境变量 说明 + 加 - 减 * 乘 / 除 % 取模 因为Shell中将*作为通配符使用, expr命令 expr ...

  7. PyCharm将选中的内容加上引号

    正常情况下,选中一段内容,再按引号,内容会被替换为引号 想要将选中的内容不被替换为引号,而在内容的两端加上引号,只需设置一下即可 File  -->  Settings  -->  Edi ...

  8. poj 3069 Saruman's Army 贪心 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=3069 题解 题目可以考虑贪心 尽可能的根据题意选择靠右边的点 注意 开始无标记点 寻找左侧第一个没覆盖的点 再来推算既可能靠右的标记点为一 ...

  9. P4728 [HNOI2009]双递增序列

    题意 这个DP状态有点神. 首先考虑一个最暴力的状态:\(f_{i,j,k,u}\)表示第一个选了\(i\)个,第二个选了\(j\)个,第一个结尾为\(k\),第二个结尾为\(u\)是否可行. 现在考 ...

  10. shutil模块(了解)

    目录 一.shutil模块 1.1 zipfile压缩解压缩 1.2 tarfile压缩解压缩 一.shutil模块 高级的文件.文件夹.压缩包处理模块. import shutil # shutil ...