1、两种创建方式 :
import threading
(1)、直接通过传递函数到对象中 t = threading.Thread(target = 函数名)
(2)、创建子类继承 threading.Thread 类重写 def run(self):方法里面写逻辑
(3)、调用时用 t = MyThread() 实例化子类创建新线程
2、线程的执行: t.start() 表示开始执行,主线程会等着子线程执行完后再结束
3、线程无执行顺序,只和操作系统调度有关,是操作系统最小执行单位。
4、多个线程之间共享全局变量(缺点是容易出现混乱),但是函数里面的变量不共享。
5、为了避免混乱,可采用轮询的方式(即:通过修改变量的值,用死循环来判断是否满足条件,
达到控制满足条件时后再执行),但是这种方式效率比较低,一般不考虑。
6、互斥锁:互斥锁是已通知的形式效率比轮询高,锁定以后返回True,缺点是容易出现死锁。
(1)创建锁:mutex = threading.Lock()
(2)锁定: mutex.acquire([blocking])
(3)释放: mutex.release()
7、生成者与消费者模式:通过一个容器来解决生产者与消费者的强耦合问题,他们彼此之间不直接
通讯,而是通过阻塞队列来进行通讯,这个阻塞队列是用来给生产者和消费者解耦,完成两个线程之
间的通讯:Queue用法和进程中的使用方法一样只是导包的时候不一样。
8、创建ThreadLocal全局对象,每个进程都可以读写多个属性且互不影响,也不用上锁,最常用的是
为每个线程绑定一个数据库连接、http请求、用户身份信息等
网友评论