进程与线程的区别
多进程适合在CPU 密集型操作(cpu 操作指令比较多,如科学计算,位数多的浮点运算)
多线程适合在IO 密集型操作(读写数据操作较多的,比如爬虫)
线程是并发,进程是并行;进程之间相互独立,是系统分配资源的最小单位,同一个进程中的所有线程共享资源。
进程:一个运行的程序或代码就是一个进程,一个没有运行的代码叫程序。进程是系统进行资源分配的最小单位,进程拥有自己的内存空间,所以进程间数据不共享,开销大。
线程:调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程的存在而存在,一个进程至少有一个线程,叫主线程,多个线程共享内存(数据共享和全局变量),因此提升程序的运行效率。
协程:用户态的轻量级线程,调度有用户控制,拥有自己的寄存器上下文和栈,切换基本没有内核切换的开销,切换灵活。
进程
什么是进程?
进程是程序的一次动态执行过程。每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据
操作系统负责其上所有进程的执行,操作系统会为这些进程合理地分配执行时间。
导入: from multiprocessing import Process
定义进程的方式有两种:
p1 = Process(…)
自定义进程
class xxxProcess(Process):
def init(self):
Process.init(self)
…
def run(self):
进程的任务
进程常用的方法:
run() # 直接运行,串行
start() # 创建线程运行
join() # 加入阻塞,主进程后面的代码不执行
close() # 关闭进程
terminate() # 阻塞进程
is_alive() # 判断target任务是否完成,如果任务完成则False,没有完成True (是否是活动的)
全局变量的使用: 每个进程中都会存在一份全局变量,不共用
进程池:
导入: from multiprocessing import Pool
pool = Pool(5)
添加任务:
非阻塞: apply_async() # 多于队列组合使用。可直接加入进程池至进程池最大容量
阻塞: apply() # 当一个进程加入后,即使没有达到进程池最大容量,后面的进程也要等待第一个进程运行完才能加入进程池
进程间通信:
queue = Queue(number)
默认都是阻塞的,可加入等待时间,超过后报错:
queue.put([timeout=seconds]) # 向队列中传入数据
queue.get([timeout=seconds]) # 从队列中取出数据
队列
导入: from multiprocessing import Queue
队列的操作:
full() 判断是否是满了
empty() 判断是否是空了 如果空了,True
qsize() 获取长度
线程
什么是线程?
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
一个线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令。
导入: from threading import Thread
定义线程的方式有两种:
p1 = Thread(…)
自定义进程
定义一个类继承Thread
重写: [init] 必须重写: run()
创建线程类对象
启动线程
线程的常用方法:
run()
start()
join()
name # 属性,默认的名为Thread-1, Thread-2,…
current_thread().name # 获取当前线程的名字
is_alive
其他如上
共享数据:如果有全局变量,则每个线程是共享的。
GIL锁
导入: from threading import Lock
lock = Lock() # 创建
方法:
lock.acquire() # 握住(上锁)
lock.release() # 释放锁
标签:协程,Thread,python,导入,线程,进程,import,执行