[b0031] python 归纳 (十六)_线程同步_锁
2024-10-18 21:05:47
# -*- 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没有加锁,两个代码在同时跑。 数据一致性无法保证
最新文章
- MySQL 磁盘I/O问题
- python3.5-day5_迭代器_生成器_装饰器_模块
- python django 多级业务树形结构规划及页面渲染
- [转]OnKeyDown Numeric Validator CLIENT SIDE
- Visual paradigm Db Archtecture Database config
- elasticsearch2.2 集群搭建各种坑
- webstorm配置react
- 使用 Make 命令构建网站
- 【转】 i2c驱动调试经验
- AngularJs(八) 过滤器filter创建
- 没有开发者账号,如何解锁wp8设备
- JS 冷知识,运行机制
- java单链表反转(花了半个多小时的作品)
- Linux 设置系统时间和时区1.Centos
- [原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(一) -- 安装jdk(含jre)及 MySql 5.6.39
- C语言学习及应用笔记之一:C运算符优先级及使用问题
- PyCharm里面执行代码没问题,Jenkins执行时找不到第三方库
- ImportError: No module named _tkinter on macos
- javaweb学习之建立简单网站
- P3455 [POI2007]ZAP-Queries(莫比乌斯反演)
热门文章
- Java生鲜电商平台-商城系统库存问题分析以及产品设计对逻辑/物理删除思考
- Oracle数据库之第四篇
- PHP strstr 字符串函数
- SQLi-LABS Page-1(Basic Challenges) Less11-Less22
- Thymeleaf常用语法:表达式语法之运算符
- Spring Boot 2 使用自定义配置
- NCCL(Nvidia Collective multi-GPU Communication Library) Nvidia英伟达的Multi-GPU多卡通信框架NCCL 学习;PCIe 速率调研;
- 0day2安全——笔记2
- Leetcode450. 删除二叉搜索树中的节点
- DRF--认证和权限