进程 启动多个进程,进程之间通过操作系统调用,操作系统又有一个时间片的概念,这样多CPU的话就可以调用多个进程。 线程 启动多个线程,真正被CPU执行的最小单位是线程,在Cpython中由于GIL锁的概念,同一时刻只能有一个线程工作。再其它语言中允许用一时间调用多个线程执行。不会影响高IO的操作。 弊端:开启一个线程,创建一个线程 需要创建寄存器,堆栈。 协程 本质就是一个线程,在多个任务之间来回调用,不需要创建寄存器,堆栈。
进程: 进程是一个正在运行的程序,程序不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序称之为进程。 进程的提出是在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行,大大提高了CPU的利用率。进程就是为了在CPU上实现多道编程而提出的。 但是进程也有很多缺点例如: - 进程只能在同一时间干一件事,如果同时干两件事或多件事,进程就无能为力了。 - 进程在执行的过程中如果出现阻塞,例如等待输入,整个进程会被挂起。 - 进程开销大,创建,撤销与切换存在较大的时空开销。 后来出现了线程,线程是CPU调度的最小单位,每个进程中至少有一个线程。 线程比进程的优势: - 地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程共享。 - 通信: 进程间通信IPC,线程间可以直接读写进程的资源。 - 调度和切换:线程上下文切换要比进程上下文切换要快得多。 全局解释器锁GIL - 由于CPython解释器锁的原因,同一时刻只能有一个线程运行,所以Python在CPython解释器中的多线程形同虚设。 递归锁和互斥锁 递归锁(RLock)是为了解决死锁问题,且在线程中,递归锁可以被acquire多次。 互斥锁(Lock) 信号量 KTV同一时刻只能有几个人进入到这个房间 同一时间只能有N个线程处理 事件
创建进程两种方式
守护进程
进程对象.deamon 值为True的时候,表示新的子进程是一个守护进程,守护进程随着主进程代码色执行结束而结束。在start之前运行
进程同步控制
进程锁
为了数据安全 事例:12306售票一个文件{"ticket":1},有1张票,有10个人过来买票,每个人都看到为1张票,抢票。
# 锁 # 火车票 import json import time from multiprocessing import Process from multiprocessing import Lock # def show(i): # with open('ticket') as f: # dic = json.load(f) # print('余票: %s'%dic['ticket']) def buy_ticket(i,lock): lock.acquire() #拿钥匙进门 with open('ticket') as f: dic = json.load(f) time.sleep(0.1) if dic['ticket'] > 0 : dic['ticket'] -= 1 print('