python的并发编程详解

进程

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()

python的并发编程详解_第1张图片

注:多进程池和多进程都要放在main中声明

扩展链接:
1)python多进程详解
2)python进程间通信详解

线程

threading

概念:程序最小的执行单位,优势切换快速。

**原理:**线程运行在cpu上是,遇到i/o阻塞就切换,利用CPU和IO可以同时执行的原理实现并行

python存在全局锁gil(Global interpreter lock):每次线程只能获取一个cpu的使用权。目的为了线程安全,也就是解决了多线程之间的数据完整性和状态同步加的锁。

python的并发编程详解_第2张图片

举例:同一时刻,两线程释放资源,这是正好线程切换,会导致对象被释放两次。

代码里可以用time.sleep()模拟阻塞

由于GIL的原因,CPU密集型(计算量大)不适合发挥多核优势,所以多线程更适合于i/o密集型。

线程安全

  • Lock资源加锁,

  • Queue实现进程、线程间通信

  • 使用线程池/进程池Pool,简化任务提交

    使用subprocess 启动外部程序进程,进行输入输出交互

扩展链接
1)python线程详解
2)python线程池详解

异步IO(协程)

协程 (corountine):又称微线程,一个线程启动多个协程。

asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行

核心原理:

python的并发编程详解_第3张图片
python的并发编程详解_第4张图片

扩展链接

1)python协程使用

总结

  • 进程就是一个程序,有独立的空间和资源. 当进程数大于CPU时,等待运行的进程会等到其他进程运行完,在运行。
  • 线程就是子程序或者说是一段函数。操作系统阻塞了。比如:time.sleep(),就中断切换。
  • 协程也是子程序,但是执行过程中。用户中断,实现切换。所以也称为用户态线程
  • 线程的切换非常消耗资源。而多个协程运行在一个主线程上就行,更适合I/O密集型
  • 所以常用的高性能方案是: 多进程+ 协程

参考

Lr:
1)https://www.bilibili.com/video/BV1bK411A7tV?p=2
2)https://zhuanlan.zhihu.com/p/169426477

你可能感兴趣的:(python,python,并发编程)