今日内容概要
- 互斥锁
- 线程
- 多线程实现TCP服务端并发
- join方法
- 同一进程下线程之间数据共享
- 线程对象相关方法
- 守护线程
- GIL全局解释器
互斥锁
多个程序同时操作一份数据的时候很容易产生数据错乱!
为了避免数据错乱,我们要使用互斥锁。
1.互斥锁
将并发变成串行,虽然牺牲了程序的执行效率,但是保证了数据安全。如何使用: # 互斥锁也是multiprocessing 模块中的类,我们可以在创建进程导模块时一起导入。 from multiprocessing import Process,Lock mutex = Lock() # 抢锁 mutex.acquire() # 释放锁 mutex.release()
注意:
互斥锁只应该出现在多个程序操作数据的地方,其他位置尽量不要加。
线程
1.线程是资源单位
进程相当于是车间,进程负责给头部的线程提供相应的资源。
2.线程是执行单位
线程相当于是车间里面的流水线,线程负责执行真正的功能。
3.一个进程至少含有一个
4.多进程与多线程的区别
- 多进程:
需要申请内存空间,需要拷贝全部代码,资源消耗大- 多线程:
不需要申请内存空间,也不需要拷贝全部代码,资源消耗小- 同一个进程下多个线程之间资源共享
5.创建线程的两种方式
开设线程不要完整的拷贝代码,所以无论什么系统都不会出现反复操作的情况,也不需要在启动脚本执行,但是为了兼容性和统一性,习惯在启动脚本编写。
线程的创建与进程创建代码步骤相似:
- 方式一:
from threading import Thread import time # 方法一: def task(name): print(f'{name}正在运行') time.sleep(3) print(f'{name}运行结束') if __name__=='__main__': # 创建线程对象 t = Thread(target=task,args=('kk',)) t.start() print('主线程')
- 方式二:
import time from threading import Thread class My_Thread(Thread): def __init__(self,name): super().__init__() self.name=name def run(elf): print(f'{self.name}正在运行') time.sleep(3) print(f'{self.name}运行结束') obj = My_Thread('jadon') obj.start() print('主线程')
多线程实现TCP服务端并发
比进程更加简单方便,消耗的资源更少。