2020.3.24 线程

发布于 2020-03-24  18 次阅读


Table of Contents

线程和进程可以传递函数,也可以传递对象的方法,比如target=A().fun1

常用线程对象属性

t.name 线程名称,带setName和getName
is_alive 查看线程是否在声明周期
t.daemon 是随着主线程销毁 setDaemon,getDaemon,isDaemon
主线程、进程结束,分支线程和子进程也结束怎么设置?
特别复杂的逻辑,需要封装为类,所以要继承Thread

自定义线程类

功能复杂,一个方法装不下的时候使用
1. 创建步骤
【1】 继承Thread类
【2】 重写__init__方法添加自己的属性,使用super加载父类属性
【3】 重写run方法
2. 使用方法
【1】 实例化对象
【2】 调用start自动执行run方法
【3】 调用join回收线程

线程同步互斥

线程之间就用全局变量通信,为了防止同时修改这个变量,要给线程加锁,或者阻塞一个线程

线程同步互斥方法

阻塞和解除阻塞
Event
set(),clear(),is_set(),wait()
Lock # 必须都使用acquire,release
acquire(),release() ,with lock()上锁,结束自动解锁

死锁

两个及以上的线程,在操作锁的过程,整乱了,都死机了
满足四个条件
1.必须使用锁
2.拥有一个,还想在请求另一个
3.不剥夺条件(系统可以抢占资源)
4.环路等待(都想要对方的资源,不放自己的资源)
交叉死锁
一个函数包含两个锁,两个锁交叉,又有两个线程
逻辑复杂,重复调用死锁
功能多,体量大,导致多次调用锁,卡死,用RLock

定时锁

RLock() #允许重复上锁,上几次解锁几次

python线程

ruby是仿照python的
1.python线程的GIL(全局解释器锁)
python在同一时刻,只能解释一个线程,所以效率很低,这个是python特有的特点
计算密集型没什么提升,io和网络,还是有提升的

进程和线程的区别联系

1. 两者都是多任务编程方式,都能使用计算机多核资源
2. 进程的创建删除消耗的计算机资源比线程多
3. 进程空间多里,数据互不干扰,有专门通信方法;线程使用去哪局变量通信
4. 一个进程可以有多个分支线程,两者有包含关系
5. 多个线程共享进程资源,在共享资源操作时往往需要同步互斥处理
6. 进程线程在系统中都有自己的特有属性标志,如ID,代码段,命令集等。

使用场景

1. 任务场景:如果是相对独立的任务模块,可能使用多进程,如果是多个分支共同形成一个整体任
务可能用多线程
2. 项目结构:多中编程语言实现不同任务模块,可能是多进程,或者前后端分离应该各自为一个进
程。
3. 难以程度:通信难度,数据处理的复杂度来判断用进程间通信还是同步互斥方法。

问题

1. 对进程线程怎么理解/说说进程线程的差异
2. 进程间通信知道哪些,有什么特点
3. 什么是同步互斥,你什么情况下使用,怎么用
4. 给一个情形,说说用进程还是线程,为什么
5. 问一些概念,僵尸进程的处理,GIL问题,进程状态