pyhton 线程锁
问题:已经有了全局解释器锁为什么还需要锁?
答:全局解释器锁是在Cpython解释器下,同一时刻,多个线程只能有一个线程被cpu调度
它是在线程和cpu之间加锁,线程和cpu之间有传递时间,即使有GIL,也无法保证数据的绝对安全
锁的分类
1、互斥锁
2、死锁
3、递归锁
# 虽然有全局解释器锁,数据仍然出现了安全问题
from threading import Thread
import time def test():
global n
temp = n
time.sleep(1)
n = temp - 1 n = 10
t_li = []
for i in range(5):
t = Thread(target=test)
t_li.append(t)
t.start()
[t.join() for t in t_li]
print(n) #
互斥锁
# 使用锁,解决了数据安全问题
from threading import Thread, Lock
import time def test(lock):
lock.acquire()
global n
temp = n
time.sleep(1)
n = temp - 1
lock.release() n = 10
lock = Lock()
t_li = []
for i in range(5):
t = Thread(target=test, args=(lock, ))
t_li.append(t)
t.start()
[t.join() for t in t_li]
print(n) #
死锁
# 科学家吃面
from threading import Lock
from threading import Thread
import time
noddle = Lock()
chopsticks = Lock() def test1(name):
noddle.acquire()
print('%s拿到面条' % name)
# time.sleep(2)
chopsticks.acquire()
print('%s拿到筷子' % name)
print('%s吃面' % name)
# time.sleep(1)
chopsticks.release()
noddle.release() def test2(name):
chopsticks.acquire()
print('%s拿到筷子' % name)
time.sleep(0.3)
noddle.acquire()
print('%s拿到面条' % name)
print('%s吃面' % name)
noddle.release()
chopsticks.release() t1 = Thread(target=test1, args=('tom', ))
t1.start()
t2 = Thread(target=test2, args=('abc', ))
t2.start() t3 = Thread(target=test1, args=('joker', ))
t3.start()
t4 = Thread(target=test2, args=('ff', ))
t4.start()
递归锁
# 递归锁,多个acquire()不会造成死锁
from threading import RLock
from threading import Thread
a = RLock() def test():
a.acquire()
a.acquire()
a.acquire()
print('hello, world') Thread(target=test).start()
# 科学家吃面 递归锁
from threading import RLock
from threading import Thread
import time
noddle = chopsticks = RLock() def test1(name):
noddle.acquire()
print('%s拿到面条' % name)
# time.sleep(2)
chopsticks.acquire()
print('%s拿到筷子' % name)
print('%s吃面' % name)
# time.sleep(1)
chopsticks.release()
noddle.release() def test2(name):
chopsticks.acquire()
print('%s拿到筷子' % name)
time.sleep(0.3)
noddle.acquire()
print('%s拿到面条' % name)
print('%s吃面' % name)
noddle.release()
chopsticks.release() t1 = Thread(target=test1, args=('tom', ))
t1.start()
t2 = Thread(target=test2, args=('abc', ))
t2.start()
t3 = Thread(target=test1, args=('joker', ))
t3.start()
t4 = Thread(target=test2, args=('ff', ))
t4.start()
pyhton 线程锁的更多相关文章
- NSLock线程锁的使用测试
测试1:NSLock线程锁是不是单例? 打印: 结论1:NSLock不是单例 测试2:同一个线程锁在不同的地方锁定,是否会有锁定两个? 打印为: 结论2:顺序打印,在不同的地方锁定也可以锁定. 测试3 ...
- day9---多线程,线程锁,队列
进程.线程 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 使用threading模块实现多线程编程[综述] Pyt ...
- python线程锁
import time,threading balance = 0 lock = threading.Lock() def change_it(n): global balance balance = ...
- linux下使用线程锁互斥访问资源
linux使用线程锁访问互斥资源: 1.线程锁的创建 pthread_mutex_t g_Mutex; 2.完整代码如下 #include <stdio.h> #include <s ...
- JAVA线程锁-读写锁
JAVA线程锁,除Lock的传统锁,又有两种特殊锁,叫读写锁ReadWriteLock 其中多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥 例子: /** * java线程锁分为读写锁 ReadWri ...
- Java线程锁一个简单Lock
/** * @author * * Lock 是java.util.concurrent.locks下提供的java线程锁,作用跟synchronized类似, * 单是比它更加面向对象,两个线程执行 ...
- python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)
python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...
- Linux同步机制(一) - 线程锁
1 互斥锁 在线程实际运行过程中,我们经常需要多个线程保持同步. 这时可以用互斥锁来完成任务.互斥锁的使用过程中,主要有 pthread_mutex_init pthread_mutex_destor ...
- 单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式-b
1.单利模式概述 链接: iOS开发懒汉模式&恶寒模式 2.使用GCD实现单利模式 2.1新建一个project,然后新建一个HMDataTool类展示GCD实现单例模式 #import & ...
随机推荐
- js基础——function类型
1.函数声明方式 1)普通声明方式 function box(num1,num2){ return num1 + num2; } 2)使用变量初始化函数 var box = funct ...
- 2018-3-31-C#-谁改了我的代码
title author date CreateTime categories C# 谁改了我的代码 lindexi 2018-3-31 21:15:3 +0800 2018-2-13 17:23:3 ...
- 基于串口调试助手的WIFI模块调试-FPGA简单联网(点灯)
根据正点原子的<ATK-ESP8266 WIFI用户手册>,使用XCOM V2.2串口调试助手测试WIFI模块[26].在本系统中运用到的功能主要是TCP/IP模式中的TCP Client ...
- 随机抽样 (numpy.random)
随机抽样 (numpy.random) 简单的随机数据 rand(d0, d1, ..., dn) 随机值 >>> np.random.rand(3,2) array([[ 0.14 ...
- linux进程唤醒的细节
我们已展现的唤醒进程的样子比内核中真正发生的要简单. 当进程被唤醒时产生的真正动 作是被位于等待队列入口项的一个函数控制的. 缺省的唤醒函数[22]22设置进程为可运行的 状态, 并且可能地进行一个上 ...
- ZR7.17
7.17 F 认真读题吧 A 算法一: \(c = ab,x = a + b + c\) 所以 \(x = a + b + ab\) \(=(b + 1)a + b\) 所以我们枚举\(b\) \(O ...
- 利用Redis实现集群或开发环境下SnowFlake自动配置机器号
前言: SnowFlake 雪花ID 算法是推特公司推出的著名分布式ID生成算法.利用预先分配好的机器ID,工作区ID,机器时间可以生成全局唯一的随时间趋势递增的Long类型ID.长度在17-19位. ...
- 20191031-4 beta week 1/2 Scrum立会报告+燃尽图 02
此作业要求参见 https://edu.cnblogs.com/campus/nenu/2019fall/homework/9912 git地址:https://e.coding.net/Eustia ...
- Ubuntu 18.04 64位安装tensorflow-gpu
第一步(可直接跳到第二步):安装nvidia显卡驱动 linux用户可以通过官方ppa解决安装GPU驱动的问题.使用如下命令添加Graphic Drivers PPA: 1 sudo add-apt- ...
- 使用wordPress搭建个人博客
第一章:前期准备工作 现在比较流行的博客社区有博客园.开源中国.思否.掘金.CSDN.简书等等,平时可以在自己喜欢的社区分享交流相关专业知识.如果你想拥有一个自己的博客,下面就跟我一起了解一下,我 ...