python的并发编程详解

进程

multiprocessing

概念:程序运行的 实例,是系统资源分配和调度的的最小单位

任务实例拆分成更小的模块,在给线程使用,线程共享进程空间,线程再分就是协程。

多进程适合于cpu密集型

**cpu密集型:**计算密集型,特点是cpu占用率高

i/o密集型: 磁盘读写多,CPU占用率不高

语法条目多线程多进程
模块from threading import Threadfrom 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线程池详解

异步IO(协程)

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

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

核心原理:

在这里插入图片描述
在这里插入图片描述

扩展链接

1)python协程使用

总结

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

参考

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云中烤飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值