一、线程理论
1. 线程是什么
- 每个进程有一个地址空间,而且默认有一个线程
- 进程只是用来把资源集中到一起,而线程才是CPU上的执行单位(进程只是个资源单位)
2. 线程和进程的区别
- 同一个进程内的多个线程共享该进程内的地址资源
- 创建线程的开销远远要小于创建进程的开销
- 创建一个进程,就是创建一个车间,涉及到申请空间,而且在空间内建至少一条流水线就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小)
3.多线程的举例
二、开启线程的两种方式
方式一:函数式开启线程
1 from threading import Thread 2 from time import sleep 3 4 5 def read(name): 6 print('%s start read!' % name) 7 sleep(3) 8 print('%s stop read!' % name) 9 10 11 if __name__ == '__main__': 12 t = Thread(target=read,args=('sjingx',)) 13 t.start() 14 print('主线程')
方式二:类继承方式开启线程
1 from threading import Thread 2 from time import sleep 3 4 5 class Read(Thread): 6 def __init__(self, name): 7 super().__init__() 8 self.name = name 9 10 def run(self): 11 print('%s start read!' % self.name) 12 sleep(3) 13 print('%s stop read!' % self.name) 14 15 16 if __name__ == '__main__': 17 r = Read('sjingx') 18 r.run() 19 print('主线程')
练习题:
1. 基于多线程实现并发的套接字通信。
2. 编写一个简单的文本处理工具,具备三个任务,一个接收用户输入,一个将用户输入的内容格式化成大写,一个将格式化后的结果存入文件。
三、多线程和多进程的区别
1.谁开启速度快
在主进程下开启线程
import time from multiprocessing import Process from threading import Thread # 开启进程 class Read(Process): def __init__(self, name): super().__init__() self.name = name def run(self): print('%s start read' % self.name) if __name__ == '__main__': t1 = time.time() r = Read('sjingx') r.start() print('主进程') t2 = time.time() print(t2-t1) # 结果是: # 主进程 # 0.024098873138427734 # sjingx start read
在主进程下开启进程
import timefrom threading import Thread # 开启线程 class Read(Thread): def __init__(self, name): super().__init__() self.name = name def run(self): print('%s start read' % self.name) if __name__ == '__main__': t1 = time.time() r = Read('sjingx') r.start() print('主线程') t2 = time.time() print(t2-t1) # 运行结果: # sjingx start read # 主线程 # 0.001003265380859375
2.多线程和多进程pid的情况
3.同一进程内的线程共享该进程的数据
四、Thread对象的其他属性或方法
五、守护线程
六、GIL全局解释器锁
七、死锁现象与递归锁