并发编程
-
概述
非并发:
程序由单个步骤序列构成
包含独立子任务的程序执行性能低
并发:
异步、效率高
分解子程序、简化流程与逻辑
进程 process:
一个程序的执行实例
每个进程有自己的地址空间、内存、数据栈以及辅助数据
线程 thread:
同一进程之内,可被并行激活的控制流
共享相同上下文(空间地址、数据结构)
特点:
便于信息共享和通信
线程访问顺序差异会导致结果不一致(条件 race condition)
Python GIL 全局解释器锁:
global interpreter lock
python代码由虚拟机(解释器主循环)控制
主循环同时只能有一个控制线程执行
-
多线程
(单线程)
import time
time.ctime()获取当前时间
time.sleep(n)沉睡n秒
print(f'{time.ctime}')不用format直接搞到手
_thread模块:(多线程)
特点:
没有控制进程结束机制
只有一个同步原语(锁)
功能少于threading 模块
_thread.start_new_thread(function, args, **kwargs = None)开始线程args必须是元组(4,)。函数不写括号
在主函数里面需要在写一次time.sleep(n)让主函数等等其他函数的执行。(也可以通过锁类来完成,但是很麻烦,所以被不常用了)
threading 模块:
.Thread 线程类:
构造:
.Thread(target = 目标函数, args = (参数, ))
自定义Thread派生类,重写run方法逻辑
.start() 启动线程
.join() 要求主线程等待
threading.current_thread().name 线程名称
.current_thread() 获取当前线程
threading.Lock同步原语:锁:
先声明lock = threading.Lock()
.acquire() 获得
.release() 释放
支持上下文操作 with lock:
(放在函数里)
-
队列
queue 模块:
Queue FIFO:
.Queue(maxsize = 0)构造实例
.put(item, block = True, timeout = None)放入数据项(timeout就是过了这么长时间后自动结束)
.get(block = True, timeout = None) 获取数据项
.task_done() 声明当前队列任务处理完毕
.join() 队列所有项处理完毕前阻塞
LifoQueue LIFO栈,最后进最先出
PriorityQueue 优先队列
-
Multiprocess多进程
充分运用多核、多CPU的计算能力,适用于计算密集型任务
-
concurrent.futures 模块
ThreadPoolExecutor
ProcessPoolExecutor
装饰器
-
概述
用于管理和增强函数和类行为的代码
提供一种在函数或类定义中插入自动运行代码的机制
特点:
更明确的语法
更高的代码可读性
更好的一致性
-
编写
函数基础:
将函数赋给变量
将函数作为参数传递
函数嵌套及跨域访问
函数定义装饰器
装饰器参数