python并发编程之线程(创建线程,锁(死锁现象,递归锁),GIL锁)
什么是线程
进程:资源分配单位
线程:cpu执行单位(实体),每一个py文件中就是一个进程,一个进程中至少有一个线程
线程的两种创建方式:
一
- from threading import Thread
- def f1(n):
- print(n,'号线程')
- if __name__ == '__main__':
- t1 = Thread(target=f1,args=(1,))
- t1.start()
- print('主线程')
二
- from threading import Thread
- class MyThread(Thread):
- def __init__(self,name):
- super().__init__()
- self.name = name
- def run(self):
- print('hello:' + self.name)
- if __name__ == '__main__':
- t = MyThread('haha')
- t.start()
- print('主线程结束')
线程的创建和销毁,相对于进程来说开销特别小
线程之间资源共享,共享的是同一个进程中的资源, 资源共享就涉及到数据安全问题,加锁来解决
线程锁
From threading import Thread,Lock
def f1:
Loc.acquire()
代码
Loc.release()
main
Loc = Lock()
T = thread(target=f1,args=(loc,)
- from multiprocessing import Queue
- import queue
- import time
- from threading import Lock,Thread
- num = 100
- def f1(loc):
- loc.acquire()
- global num
- tmp = num
- tmp -= 1
- time.sleep(0.001)
- num = tmp
- loc.release()
- if __name__ == '__main__':
- t_loc = Lock()
- t_list = []
- for i in range(10):
- t = Thread(target=f1,args=(t_loc,))
- t.start()
- t_list.append(t)
- [tt.join() for tt in t_list]
- print('主线的num',num)
锁:牺牲了效率,保证了数据安
死锁现象(天长地久,永不分离):
出现在锁嵌套的时候,双方互相抢对方已经拿到的锁,导致双方互相等待,这就是死锁现象
- import time
- from threading import Thread,Lock,RLock
- def f1(locA,locB):
- locA.acquire()
- print('f1>>1号抢到了A锁')
- time.sleep(1)
- locB.acquire()
- print('f1>>1号抢到了B锁')
- locB.release()
- locA.release()
- def f2(locA,locB):
- locB.acquire()
- print('f2>>2号抢到了B锁')
- locA.acquire()
- time.sleep(1)
- print('f2>>2号抢到了A锁')
- locA.release()
- locB.release()
- if __name__ == '__main__':
- locA = Lock()
- locB = Lock()
- t1 = Thread(target=f1,args=(locA,locB))
- t2 = Thread(target=f2,args=(locA,locB))
- t1.start()
- t2.start()
递归锁:
解决死锁现象
Rlock 首先本身就是个互斥锁,维护了一个计数器,每次acquire就+1,release就-1,当计数器为0的时候,大家才能抢这个锁
- import time
- from threading import Thread, Lock, RLock
- def f1(locA, locB):
- locA.acquire()
- print('f1>>1号抢到了A锁')
- time.sleep(1)
- locB.acquire()
- print('f1>>1号抢到了B锁')
- locB.release()
- locA.release()
- def f2(locA, locB):
- locB.acquire()
- print('f2>>2号抢到了B锁')
- locA.acquire()
- time.sleep(1)
- print('f2>>2号抢到了A锁')
- locA.release()
- locB.release()
- if __name__ == '__main__':
- locA = locB = RLock()
- t1 = Thread(target=f1, args=(locA, locB))
- t2 = Thread(target=f2, args=(locA, locB))
- t1.start()
- t2.start()
守护线程:
守护线程:等待所有非守护线程的结束才结束
守护进程:主进程代码运行结束,守护进程就随之结束
- import time
- from threading import Thread
- from multiprocessing import Process
- def f1():
- time.sleep(2)
- print('1号线程')
- def f2():
- time.sleep(3)
- print('2号线程')
- if __name__ == '__main__':
- t1 = Thread(target=f1,)
- t2 = Thread(target=f2,)
- t2.daemon = True
- t1.start()
- t2.start()
- print('主线程结束')
GIL锁 :
cpython解释器上的一把互斥锁,当线程需要进入cpu做运算时必须一个一个经过GIL锁
线程的事件,信号量 与进程的事件,信号量 用法相同.
python并发编程之线程(创建线程,锁(死锁现象,递归锁),GIL锁)的更多相关文章
- python并发编程之进程、线程、协程的调度原理(六)
进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...
- Java并发编程:如何创建线程?
Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...
- 【转】Java并发编程:如何创建线程?
一.Java中关于应用程序和进程相关的概念 在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认是java.exe或者javaw.exe(windows下可以通过 ...
- 2、Java并发编程:如何创建线程
Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...
- java并发编程:如何创建线程
原文:http://www.cnblogs.com/dolphin0520/p/3913517.html 一.Java中关于应用程序和进程相关的概念 在Java中,一个应用程序对应着一个JVM实例(也 ...
- Java并发编程:Java创建线程的三种方式
目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...
- day 33 什么是线程? 两种创建方式. 守护线程. 锁. 死锁现象. 递归锁. GIL锁
一.线程 1.进程:资源的分配单位 线程:cpu执行单位(实体) 2.线程的创建和销毁开销特别小 3.线程之间资源共享,共享的是同一个进程中的资源 4.线程之间不是隔离的 5.线程可不需 ...
- python 并发编程 进程池与线程池
一 进程池与线程池 1.为什么需要进程池和线程池 基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是: 服务端的程序运行在一台机器身上,一台机器性能是有极限的,不能无限开线程 服务的 ...
- python 并发编程 多线程 目录
线程理论 python 并发编程 多线程 开启线程的两种方式 python 并发编程 多线程与多进程的区别 python 并发编程 多线程 Thread对象的其他属性或方法 python 并发编程 多 ...
随机推荐
- 1550: Simple String 最大流解法
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1550 很久以前做的一题,当时队友用最大流做,现在我也是 这个转化为二分图多重匹配,就是一样的意 ...
- #1369 : 网络流一·Ford-Fulkerson算法 模板题
http://hihocoder.com/problemset/problem/1369?sid=1108721 别人都说先学网络流再学二分图,但是我先学了二分图的,感觉网络流好高端啊. 首先对于原图 ...
- Cube配置http通过SSRS连接
IIS的配置:http://www.cnblogs.com/ycdx2001/p/4254994.html 连接字符串: Data Source=http://IP74/olap/msmdpump.d ...
- A. Arya and Bran
A. Arya and Bran time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- 30个提高Web程序执行效率的好经验
尽量避免使用DOM.当需要反复使用DOM时,先把对DOM的引用存到JavaScript本地变量里再使用.使用设置innerHTML的方法来替换document.createElement/append ...
- SpriingMVC执行流程结构
SpringMVC也叫spring web mvc,属于表现层的框架,是Spring框架的一部分. Spring MVC请求流程图: request-------->DispatcherSer ...
- Servlet 示例
引入jar包: servlet-api.jar ParameterServlet.java package com.mousewheel.springmvc; import java.io.IOExc ...
- java编程基础二进制
0.java编程基础 01.二进制(原码,反码,补码) 02.位运算 03.移位运算符 二进制 原码,反码,补码 1.基本概念 二进制是逢2进位的进位制,0,1是基本算符. 现在的电子计算机技术全部使 ...
- JavaScript笔记3--标识符和保留字
1.标识符 javaScript标识符必须以字母,下划线(_)或美元符($)开始.后续的字符可以是字母/数字/下划线/美元符.也可以使用非英语语言或数学符号来书写标识符; 2.保留字 break/de ...
- static 关键字用法
static a=0; 就是把a初始化为0:初始值为0而已 即使a是局部变量,每次进入此变量所在的函数,a值还是保持上次赋值: 在中断里建议在局部变量前加上static,以确保此变量值的寿命