进程
是一个执行中的程序
每一个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据
操作系统管理其他上所有进程的执行,并未这些进程合理的分配时间
进程可以通过派生(fork或者spawn)新的进程来执行其他任务。
线程
在同一个进程下执行,并共享相同的上下文
一个进程中的各个线程与主线程共享一片数据空间
线程包括开始、执行顺序和结束三部分
它可以被抢占(中断)和临时挂机(睡眠)----让步
并发
是一种属性--程序、算法或者问题的属性
并发只是并发问题的可能方法之一
如果两个事件互不影响,则两个事件是并发的。
对多核的利用
单核CPU系统中,不存在真正的并发
GIL-全局解释器锁
GIL强制在任何时候只有一个线程可以执行Python代码
I/O密集型应用与CPU密集型应用
GIL执行顺序
1、设置GIL
2、切换进一个线程去执行
3、执行下面操作之一:
ˇ指定数量的字节码指令 ˇ线程主动让出控制权(可以调用time.sleep(0)来完成)
4、把线程设置为睡眠状态
5、解锁GIL
6、重复上面步骤。
实现一个线程
用threading模块代替thread模块
用threading.Tread创建线程
start()启动线程
join()挂起线程
threading模块对象:
Thread 表示一个执行线程的对象
Lock 锁原语对象(和)
RLock 可重入锁对象,使单一线程可以获得已持有的锁
Condition 条件变量对象,使得一个线程等待另一个线程满足特定的条件,比如改变状态或者某个数值
Event 条件变量的通用版本,任意数量的线程等待某个事件的发生,在该事件发生后所有线程将被激活
Semaphore 为线程间共享的有限资源提供一个计数器,如果没有可用资源时候会阻塞
BoundedSemaphore 与Semaphore相似,不过它不允许超过初始值
Timer 与Thread相似,不过它要在运行前等待一段时间
Barrier 创建一个“障碍”,必须达到指定数量的线程后才可用继续。
Thread对象数据属性
name 线程名 ident线程的标识符 deamon表示这个线程是否是守护线程
Thread对象方法:略
多线程中的锁实现
lock() 添加锁mylock.acquire() 释放锁 mylock.release() 产生死锁
Rlock() 同一线程中可用重复锁
Condition()
线程的调度和优化
线程池 在multiprocessing.dummy
ThreadPoolExecutor()
进程
fork 只在Unix中使用
使用multiprocessing实现多进程代码
用multiprocessing.Process创建进程
start()启动进程 join()挂起进程
os.getpid()获得进程ID
进程之间的通信
通过Queue、Pipes等实现进程之间的通信
.terminate()结束 Queue共享数据
多进程中的锁
lock Rlock Condition