multiprocessing
概念:程序运行的 实例,是系统资源分配和调度的的最小单位
任务实例拆分成更小的模块,在给线程使用,线程共享进程空间,线程再分就是协程。
多进程适合于cpu密集型
**cpu密集型:**计算密集型,特点是cpu占用率高
i/o密集型: 磁盘读写多,CPU占用率不高
语法条目 | 多线程 | 多进程 |
---|---|---|
模块 | from threading import Thread | from multiprocessing import Process |
新建 启动 等待结束 |
t = Thread(target=func, args=(100,)) t.start() t.join() |
p=Process(target=f, args=(100,)) p.start() p.join() |
队列 | import queue q = queue.Queue() q.put(item) #放入队列 item.q.get() |
from multiprocessing import Queue q = Queue() q.put(item) item = q.get() |
自身池化 | from multiprocessing.pool import ThreadPool pool=ThreadPool(2) res = spool.apply_async(func,args=(1,2),kwds={}) #kwds类似kwargs pool.close() #结束接受进程池中的任务 pool.join() #感知进程池中的任务已经结束。所以必须先停止接受 res.get() #这里取结果 ####同步 res = pool.apply(func,args=(1,2),kwds={}) print(res) |
from multiprocessing import Pool pool=Pool(2) res = pool.apply_async(func,args=(1,2),kwds={}) pool.close() #结束接受进程池中的任务 pool.join() #感知进程池中的任务已经结束。所以必须先停止接受 res.get() #这里取结果 ####同步 res = pool.apply(func,args=(1,2),kwds={}) print(res) |
模块池化(简单常用) | from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor with ThreadPoolExecutor() as pool: #法一map(func,iter_var) results = pool.map(is_prime, iter_var) #map对应的是可以迭代的,submit不行 for res in results: print(res) #法二 for var in iter_var: future = pool.submit(func, var) result = future.result() |
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor with ProcessPoolExecutor() as pool: #法一map(func,iter_var) results = pool.map(is_prime, iter_var) #map对应的是可以迭代的,submit不行 for res in results: print(res) #法二 for var in iter_var: future = pool.submit(func, var) result = future.result() |
注:多进程池和多进程都要放在main中声明
扩展链接:
1)python多进程详解
2)python进程间通信详解
threading
概念:程序最小的执行单位,优势切换快速。
**原理:**线程运行在cpu上是,遇到i/o阻塞就切换,利用CPU和IO可以同时执行的原理实现并行
python存在全局锁gil(Global interpreter lock):每次线程只能获取一个cpu的使用权。目的为了线程安全,也就是解决了多线程之间的数据完整性和状态同步加的锁。
举例:同一时刻,两线程释放资源,这是正好线程切换,会导致对象被释放两次。
代码里可以用time.sleep()模拟阻塞
由于GIL的原因,CPU密集型(计算量大)不适合发挥多核优势,所以多线程更适合于i/o密集型。
Lock资源加锁,
Queue实现进程、线程间通信
使用线程池/进程池Pool,简化任务提交
使用subprocess 启动外部程序进程,进行输入输出交互
扩展链接:
1)python线程详解
2)python线程池详解
协程 (corountine):又称微线程,一个线程启动多个协程。
asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行。
核心原理:
1)python协程使用
Lr:
1)https://www.bilibili.com/video/BV1bK411A7tV?p=2
2)https://zhuanlan.zhihu.com/p/169426477