python多线程锁lock/Rlock/BoundedSemaphore/Condition/Event
import time
import threading
lock = threading.RLock()
n = 10
def task(arg):
# 加锁,此区域的代码同一时刻只能有一个线程执行
lock.acquire()
# 获取当前线程对象
thread_obj = threading.current_thread()
# 获取当前线程名字
name = thread_obj.getName()
global n
n = arg
time.sleep(1)
print('当前线程', name, '修改后n的值为:', n)
# 释放锁
lock.release()
for i in range(5):
t = threading.Thread(target=task, args=(i,))
t.setName(str(i))
t.start()
'''
期望结果-->加锁情况:
当前线程 0 修改后n的值为: 0
当前线程 1 修改后n的值为: 1
当前线程 2 修改后n的值为: 2
当前线程 3 修改后n的值为: 3
当前线程 4 修改后n的值为: 4
'''
'''
不期望结果-->没加锁情况
当前线程 0 修改后n的值为: 4
当前线程 1 修改后n的值为: 4
当前线程 2 修改后n的值为: 4
当前线程 3 修改后n的值为: 4
当前线程 4 修改后n的值为: 4
'''
引子:为什么要加锁?
需求:每个线程将一个数字添加到列表,然后取出自己放的数字,线程结束.
希望得到的结果如下:
'''
0 0
1 1
2 2
3 3
4 4
'''
代码:
import threading
import time
lst = []
def func(arg):
# 线程安全
lst.append(arg)
time.sleep(0.1)
m = lst[-1]
print(arg,m)
for i in range(5):
t = threading.Thread(target=func,args=(i,))
t.start()
总结:
从上面这个例子看,如果不加锁,每个线程放进去自己的数字,再取最后一个数字,就不一定是自己放的,因为这个时间,可能其他线程也放进去了,你拿到的,可能是其他线程放的.所以这个时候就需要加锁,限制一个线程没操作完,另一个绝对不能动.
1.锁:Lock(1次放1个)
import threading
import time
lst = []
lock = threading.Lock()
def func(arg):
lock.acquire()
lst.append(arg)
time.sleep(0.1)
m = lst[-1]
lock.release()
for i in range(5):
t = threading.Thread(target=func,args=(i,))
t.start()
2.锁:RLock(1次放1个)
import threading
import time
lst = []
lock = threading.RLock()
def func(arg):
lock.acquire()
lock.acquire()
lst.append(arg)
time.sleep(0.1)
m = lst[-1]
print(arg, m)
lock.release()
lock.release()
for i in range(5):
t = threading.Thread(target=func, args=(i,))
t.start()
PS:Lock和RLock的区别是RLock可以多次加锁.
3.锁:BoundedSemaphore(1次放N个)信号量
import time
import threading
lst = []
# 一次放3个
lock = threading.BoundedSemaphore(3)
def func(arg):
lock.acquire()
lst.append(arg)
m = lst[-1]
print(arg, m)
time.sleep(3)
lock.release()
for i in range(10):
t = threading.Thread(target=func, args=(i,))
t.start()
4.锁:Condition(1次放x个)
方法1:
import time
import threading
lst = []
lock = threading.Condition()
def func(arg):
print('start...')
lock.acquire()
lock.wait()
lst.append(arg)
m = lst[-1]
print(arg, m)
time.sleep(1)
lock.release()
for i in range(10):
t = threading.Thread(target=func, args=(i,))
t.start()
while True:
num = int(input('>>>:'))
lock.acquire()
# 控制放几个线程执行,比如写3个,但是线程实际2个,那就是2个了
lock.notify(num) # 3
lock.release()
方法2:
import time
import threading
lock = threading.Condition()
def func1():
print('start...')
input('>>>:')
return True
def func2(arg):
print('\n线程进来了')
# func1作为执行条件
lock.wait_for(func1)
print(arg)
time.sleep(1)
for i in range(10):
t = threading.Thread(target=func2, args=(i,))
t.start()
5.锁:Event(1次放所有)
import threading
lock = threading.Event()
def func(arg):
print('线程来了')
# 加锁:红灯
lock.wait()
print(arg)
for i in range(10):
t = threading.Thread(target=func, args=(i,))
t.start()
input('>>>:')
lock.set() # 绿灯
lock.clear() # 再次变红灯
for i in range(10):
t = threading.Thread(target=func, args=(i,))
t.start()
input('>>>')
lock.set()
总结:
线程安全,列表和字典线程安全;
为什么要加锁?
- 非线程安全
- 控制一段代码
python多线程锁lock/Rlock/BoundedSemaphore/Condition/Event的更多相关文章
- python多线程threading.Lock锁用法实例
本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...
- Python多线程锁
[Python之旅]第六篇(四):Python多线程锁 python lock 多线程 多线程使用方法 多线程锁 摘要: 在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来 ...
- 扯扯python的多线程的同步锁 Lock RLock Semaphore Event Condition
我想大家都知道python的gil限制,记得刚玩python那会,知道了有pypy和Cpython这样的解释器,当时听说是很猛,也就意味肯定是突破了gil的限制,最后经过多方面测试才知道,还是那德行… ...
- python 多线程中的同步锁 Lock Rlock Semaphore Event Conditio
摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lo ...
- Python3学习之路~9.3 GIL、线程锁之Lock\Rlock\信号量、Event
一 Python GIL(Global Interpreter Lock) 全局解释器锁 如果一个主机是单核,此时同时启动10个线程,由于CPU执行了上下文的切换,让我们宏观上看上去它们是并行的,但实 ...
- [b0039] python 归纳 (二四)_多进程数据共享和同步_锁Lock&RLock
# -*- coding: utf-8 -*- """ 多进程 锁使用 逻辑: 10个进程各种睡眠2秒,然后打印. 不加锁同时打印出来,总共2秒,加锁一个接一个打印,总共 ...
- python 多进程锁Lock和共享内存
多进程锁 lock = multiprocessing.Lock() 创建一个锁 lock.acquire() 获取锁 lock.release() 释放锁 with lock: 自动获取.释放锁 类 ...
- 线程使用方法 锁(lock,Rlock),信号了(Semaphore),事件(Event),条件(Ccndition),定时器(timer)
2线程的使用方法 (1)锁机制 递归锁 RLock() 可以有无止尽的锁,但是会有一把万能钥匙 互斥锁: Lock() ...
- python 多线程锁机制
GIL(全局解释器锁) GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念,是为了实现不同线程对共享资源访问的互斥,才引入了GIL 在Cpython解释器 ...
随机推荐
- [个人开发人员赚钱九]做一个日收入10元的APP!
[导语]尽管讲了非常多个人开发人员的文章.但新手开发人员怎样赚自己的第一个10块钱.确是最难的事情.群里有人说都不知道干什么app赚钱.全然没有想法.而且常常问我有什么高速赚钱的方法.我仅仅能遗憾地 ...
- poj Squares n个点,共能组成多少个正方形 二分 + 哈希
题目链接:http://poj.org/problem?id=2002 测试数据: 41 00 11 10 090 01 02 00 21 22 20 11 12 14-2 53 70 05 20 有 ...
- H3C-WA2210升级
前几天升级了2210固件,做个记录 首先吐槽一点:华为官方给出的公共下载账号yx800根本没用..下不了官方提供的固件资料 组网准备: 升级之前要先看看原机版本(dis ver): 在升级版本之前,请 ...
- linux命令之高级使用 find
1. 想查看当前文件夹及子文件夹里有没有文件名为“abc”的文件 # find . -name abc . :表示当前目录 -name:表示要根据名称查找 2. 想查看当前文件夹及子文件夹里有没有”x ...
- springboot2.0 fastjson 日期格式化不生效解决
网上有很多介绍,主要有两种. 1.在启动类中注入bean /** * 集成fastjson * * @return */ @Bean public HttpMessageConverters fast ...
- Effective C++:条款39:明智而审慎地使用private继承
(一) (1)private继承意味着"依据某物实现出".仅仅有实现部分被继承.接口部分应略去: (2)它仅仅在软件"实现"层面上有意义,在软件"设计 ...
- 推广Facebook技巧
1.创建有吸引力的内容发布多样化的内容,包括图片,状态更新,视频,投票等.可以问你的粉丝一些问题让他们提供答案.这些内容不仅你的粉丝可以看到,它们还将会出现在你粉丝的个人动态栏,所以他们的朋友也是可以 ...
- 使用inotify+rsync实现服务器间文件同步
1. rsync 1.1 什么是rsync rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到 ...
- ThinkPHP 模板 Volist 标签嵌套循环输出多维数组
ThinkPHP 中对 volist 标签嵌套使用可实现多维数组的输出. volist 嵌套使用 一般的二维数组,可以用 volist 标签直接循环输出.对于多维数组,则需要对其中的数组成员再次使用 ...
- freemarker 超出字符用省略号表示
<#if x.content?length lt 200> ${x.content} <#else> ${x.content[0..201]}... </#if>