什么是线程

进程:资源分配单位

线程:cpu执行单位(实体),每一个py文件中就是一个进程,一个进程中至少有一个线程

线程的两种创建方式:

  1. from threading import Thread
  2. def f1(n):
  3. print(n,'号线程')
  4.  
  5. if __name__ == '__main__':
  6. t1 = Thread(target=f1,args=(1,))
  7. t1.start()
  8. print('主线程') 

  1. from threading import Thread
  2. class MyThread(Thread):
  3. def __init__(self,name):
  4. super().__init__()
  5. self.name = name
  6.  
  7. def run(self):
  8. print('hello:' + self.name)
  9.  
  10. if __name__ == '__main__':
  11.  
  12. t = MyThread('haha')
  13. t.start()
  14. print('主线程结束')

线程的创建和销毁,相对于进程来说开销特别小

线程之间资源共享,共享的是同一个进程中的资源,  资源共享就涉及到数据安全问题,加锁来解决

线程锁

From threading import Thread,Lock

def f1: 

  Loc.acquire()

  代码

  Loc.release()

main

  Loc = Lock()

  T = thread(target=f1,args=(loc,)

  1. from multiprocessing import Queue
  2. import queue
  3. import time
  4. from threading import Lock,Thread
  5.  
  6. num = 100
  7. def f1(loc):
  8. loc.acquire()
  9. global num
  10. tmp = num
  11. tmp -= 1
  12. time.sleep(0.001)
  13. num = tmp
  14. loc.release()
  15.  
  16. if __name__ == '__main__':
  17.  
  18. t_loc = Lock()
  19. t_list = []
  20. for i in range(10):
  21. t = Thread(target=f1,args=(t_loc,))
  22. t.start()
  23. t_list.append(t)
  24. [tt.join() for tt in t_list]
  25. print('主线的num',num)

锁:牺牲了效率,保证了数据安

死锁现象(天长地久,永不分离):

出现在锁嵌套的时候,双方互相抢对方已经拿到的锁,导致双方互相等待,这就是死锁现象

  1. import time
  2. from threading import Thread,Lock,RLock
  3.  
  4. def f1(locA,locB):
  5. locA.acquire()
  6. print('f1>>1号抢到了A锁')
  7. time.sleep(1)
  8. locB.acquire()
  9. print('f1>>1号抢到了B锁')
  10. locB.release()
  11.  
  12. locA.release()
  13. def f2(locA,locB):
  14. locB.acquire()
  15.  
  16. print('f2>>2号抢到了B锁')
  17.  
  18. locA.acquire()
  19. time.sleep(1)
  20. print('f2>>2号抢到了A锁')
  21. locA.release()
  22.  
  23. locB.release()
  24. if __name__ == '__main__':
  25. locA = Lock()
  26. locB = Lock()
  27. t1 = Thread(target=f1,args=(locA,locB))
  28. t2 = Thread(target=f2,args=(locA,locB))
  29. t1.start()
  30. t2.start()

递归锁:

解决死锁现象

Rlock  首先本身就是个互斥锁,维护了一个计数器,每次acquire就+1,release就-1,当计数器为0的时候,大家才能抢这个锁

  1. import time
  2. from threading import Thread, Lock, RLock
  3.  
  4. def f1(locA, locB):
  5. locA.acquire()
  6. print('f1>>1号抢到了A锁')
  7. time.sleep(1)
  8. locB.acquire()
  9. print('f1>>1号抢到了B锁')
  10. locB.release()
  11. locA.release()
  12.  
  13. def f2(locA, locB):
  14. locB.acquire()
  15. print('f2>>2号抢到了B锁')
  16. locA.acquire()
  17. time.sleep(1)
  18. print('f2>>2号抢到了A锁')
  19. locA.release()
  20. locB.release()
  21.  
  22. if __name__ == '__main__':
  23.  
  24. locA = locB = RLock()
  25. t1 = Thread(target=f1, args=(locA, locB))
  26. t2 = Thread(target=f2, args=(locA, locB))
  27. t1.start()
  28. t2.start()

守护线程:

守护线程:等待所有非守护线程的结束才结束

守护进程:主进程代码运行结束,守护进程就随之结束

  1. import time
  2. from threading import Thread
  3. from multiprocessing import Process
  4.  
  5. def f1():
  6. time.sleep(2)
  7. print('1号线程')
  8. def f2():
  9. time.sleep(3)
  10. print('2号线程')
  11.  
  12. if __name__ == '__main__':
  13. t1 = Thread(target=f1,)
  14. t2 = Thread(target=f2,)
  15. t2.daemon = True
  16. t1.start()
  17. t2.start()
  18. print('主线程结束')

GIL锁 :

  cpython解释器上的一把互斥锁,当线程需要进入cpu做运算时必须一个一个经过GIL锁

线程的事件,信号量 与进程的事件,信号量 用法相同.

python并发编程之线程(创建线程,锁(死锁现象,递归锁),GIL锁)的更多相关文章

  1. python并发编程之进程、线程、协程的调度原理(六)

    进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...

  2. Java并发编程:如何创建线程?

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  3. 【转】Java并发编程:如何创建线程?

    一.Java中关于应用程序和进程相关的概念 在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认是java.exe或者javaw.exe(windows下可以通过 ...

  4. 2、Java并发编程:如何创建线程

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  5. java并发编程:如何创建线程

    原文:http://www.cnblogs.com/dolphin0520/p/3913517.html 一.Java中关于应用程序和进程相关的概念 在Java中,一个应用程序对应着一个JVM实例(也 ...

  6. Java并发编程:Java创建线程的三种方式

    目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...

  7. day 33 什么是线程? 两种创建方式. 守护线程. 锁. 死锁现象. 递归锁. GIL锁

    一.线程     1.进程:资源的分配单位    线程:cpu执行单位(实体) 2.线程的创建和销毁开销特别小 3.线程之间资源共享,共享的是同一个进程中的资源 4.线程之间不是隔离的 5.线程可不需 ...

  8. python 并发编程 进程池与线程池

    一 进程池与线程池 1.为什么需要进程池和线程池 基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是: 服务端的程序运行在一台机器身上,一台机器性能是有极限的,不能无限开线程 服务的 ...

  9. python 并发编程 多线程 目录

    线程理论 python 并发编程 多线程 开启线程的两种方式 python 并发编程 多线程与多进程的区别 python 并发编程 多线程 Thread对象的其他属性或方法 python 并发编程 多 ...

随机推荐

  1. 1550: Simple String 最大流解法

    http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1550 很久以前做的一题,当时队友用最大流做,现在我也是 这个转化为二分图多重匹配,就是一样的意 ...

  2. #1369 : 网络流一·Ford-Fulkerson算法 模板题

    http://hihocoder.com/problemset/problem/1369?sid=1108721 别人都说先学网络流再学二分图,但是我先学了二分图的,感觉网络流好高端啊. 首先对于原图 ...

  3. Cube配置http通过SSRS连接

    IIS的配置:http://www.cnblogs.com/ycdx2001/p/4254994.html 连接字符串: Data Source=http://IP74/olap/msmdpump.d ...

  4. A. Arya and Bran

    A. Arya and Bran time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  5. 30个提高Web程序执行效率的好经验

    尽量避免使用DOM.当需要反复使用DOM时,先把对DOM的引用存到JavaScript本地变量里再使用.使用设置innerHTML的方法来替换document.createElement/append ...

  6. SpriingMVC执行流程结构

    SpringMVC也叫spring web mvc,属于表现层的框架,是Spring框架的一部分. Spring  MVC请求流程图: request-------->DispatcherSer ...

  7. Servlet 示例

    引入jar包: servlet-api.jar ParameterServlet.java package com.mousewheel.springmvc; import java.io.IOExc ...

  8. java编程基础二进制

    0.java编程基础 01.二进制(原码,反码,补码) 02.位运算 03.移位运算符 二进制 原码,反码,补码 1.基本概念 二进制是逢2进位的进位制,0,1是基本算符. 现在的电子计算机技术全部使 ...

  9. JavaScript笔记3--标识符和保留字

    1.标识符 javaScript标识符必须以字母,下划线(_)或美元符($)开始.后续的字符可以是字母/数字/下划线/美元符.也可以使用非英语语言或数学符号来书写标识符; 2.保留字 break/de ...

  10. static 关键字用法

    static a=0; 就是把a初始化为0:初始值为0而已 即使a是局部变量,每次进入此变量所在的函数,a值还是保持上次赋值: 在中断里建议在局部变量前加上static,以确保此变量值的寿命