标签:star 相对 分派 设置 python解释器 并发 是否存活 上下文 bubuko
一. 为什么要有线程
进程是资源分配的最小单位,线程是CPU调度的最小单位.
进程虽然可以提高计算机的利用率,但是进程还是有很多缺点,如果想同时做多件事,需要多进程;进程在执行的过程中,如果被阻塞,例如等待输入,整个进程就会被挂起,即使进程中有些工作不依赖于输入的数据,也无法执行.
二. 线程和进程的关系
进程间的内存空间和资源时相互独立的,同一个进程内的线程是可以共享进程内的所有资源.某进程的线程在其他进程是不可见的.
进程间的通信靠IPC(队列,管道),线程间可以直接读写进程的数据段
线程上下文切换比进程的上下文切换要快的多.
在多线程操作系统中,进程不是一个可以执行的实体.
三. 线程的特点
线程的实体基本不拥有系统的资源,除了必不可少的要保证独立运行的资源
线程的实体由代码块,数据块,TCP组成.线程是动态概念
在多线程os中,线程是能独立运行的基本单位,因此也是独立调度和独立分派的基本单位.线程的切换是非常迅速的而且开销很小
线程共享进程内的所有资源,所有线程都具有相同的进程的id
在同一个或不同进程中的线程是可以并发执行的.
线程分为 :
用户级线程 : 内核的切换由用户(程序员)控制内核切换,不需要内核干涉,减少进出内核的消耗,但不能很好的利用多核CPU.
内核级线程 : 线程切换由内核控制,当线程进行切换的时候,由用户态转化为内核态.线程切换完成后要从内核态返回用户态,可以很好的利用多核的CPU.
四. GIL(全局解释器锁)
将线程上锁,是CPython解释器上的一个锁,意思是在同一时间值允许一个线程访问CPU.
因为GIL锁的存在,在CPython中,没有真正的线程并行. 但是有真正的 多进程并行.
总结 : 在Cpython中, IO密集用多线程,计算密集用多进程.
五. python线程中的模块
1. threading模块 : 和进程中multiprocessing模块使用方法有很大的相似性
2. Thread : 创建线程需要导入的模块 ( from threading import Thread )
3. 线程的创建 : (普通创建和继承Thread类)
t = Thread( target = , args = ( ‘元组‘, ))
t.start()
class Xiancheng(Thread):
def __init__(self):
super().__init__()
4. 线程的其他方法 :
相对于实例化对象的方法 :
isAlive() : 判断线程是否存活
getName() : 返回线程名
setName() : 设置线程名
threading模块的一些方法 :
threading.currentThread() : 返回当前的线程变量
threading.enumerate() : 返回一个包含正在运行线程的列表. 正在运行指启动后,结束前,不包括启动前和终止后的线程.
threading.activeCount() : 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果.
5. 守护线程 :
守护进程,根据父进程的代码结束而结束.
守护线程,根据父进程的执行结束而结束.
标签:star 相对 分派 设置 python解释器 并发 是否存活 上下文 bubuko
原文地址:https://www.cnblogs.com/dong-/p/9526388.html