《Effective Python 编写高质量Python代码的59个有效方法》第五章(共八章)阅读总结

在这里插入图片描述
年纪大了,记性不好,老忘,所以在读完这本书后写了这一系列文章,文章中没有任何书中的示例代码,只是对每条知识点的总结。写给自己看,分享给大家看,不足之处欢迎指正。

第五章:并发及并行(总结)

第36条:用subprocess模块来管理子进程

sunbprocess模块应该是Python目前最好且最简单的子进程管理模块

总结:
1.可以用 subprocess模块运行子进程,并管理其输入和输出流
2.Python解释器能够平行的运行多条子进程,使我们可以充分的利用CPU的处理能力
3.communicate 的 timeout 参数避免死锁和被挂起的子进程

第37条:可以用线程来执行阻塞式I/O,但不要用它做平行计算

我们用的主流python叫cpython,在同一时刻,多个线程运行是相互抢占资源允许的,cpython无法把线程分配到多个CPU运行,就造成了计算密集型无法使用多个CPU 同时运行.这是由于cpython在运行的时候就加了一把锁(GIL),这是一个历史问题.
说白了python是没有多线程,因为同一时刻只能运行一个线程(多个线程分配到多个CPU运行,才是真正意义上面多线程,python无法做到.)

总结:
1.因为GIL,Python thread并不能并行运行多段代码
2.尽管受制于GIL,但是python的多线程功能依然很有用,它可以轻松地模拟出同一时刻执行多项任务的效果
3.通过python线程,我们可以平行地执行多个系统调用,这使得程序能够在执行阻塞式I/O操作的同时,执行一些运算操作
4.如果任务是IO密集型的,可以使用多线程(阻塞等待时,就释放GIL,给另一个线程执行的机会)  
5.如果是计算密集型的,无法使用多线程(如果遇到CPU密集型的线程,一直占用CPU,不会被I/O阻塞,是不是其它线程就没有机会执行了呢? 其实不是,为了避免这种情况,有系统切换CPU轮询时间方式)

第38条:在线程中使用Lock来防止数据竞争

虽然Python thread不能同时执行,而且多个线程对同一个对象进行修改,一般也不会出错,但是,这个不出错纯粹是概率问题,因为 GIL 进行线程切换的过程对我们是不透明的。

总结:Python thread还是需要锁的,thread模块的Lock类是Python的互斥锁实现

第39条:用Queue来协调各线程之间的工作

队列:先进先出
队列放满之后,再放会阻塞
队列取完之后,再取会阻塞
Python中就有这样一个类Queue类

总结:Queue类具备构建健壮并发管道的特性:阻塞操作,缓存大小和连接(join)

第40条:考虑用协程来并发的运行多个函数

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

总结:
1.协程提供了一种有效的方式,令程序看上去好像能够同时运行大量函数
2.对于生成器内的yield表达式来说,外部代码通过send方法传给生成器的那个值就是该表达式所要具备的值
3.协程是一种强大的工具,它可以把程序的核心逻辑,与程序同外部环境交互时所使用的代码相隔离

第41条:考虑用concurrent.futures来实现真正的平行计算

python标准库为我们提供了threading和mutiprocessing模块实现异步多线程/多进程功能。从python3.2版本开始,标准库又为我们提供了concurrent.futures模块来实现线程池和进程池功能,实现了对threading和mutiprocessing模块的高级抽象,更大程度上方便了我们python程序员。

总结:concurrent.futures的multiprocessing可以并行处理一些任务,Python2没有这个模块,但是multiprocessing 开销比较大,因为主进程和子进程之间的通信,必须进行序列化和反序列化操作。如果进程之间要传输很多数据,而每个进程的计算量相对较小,必须通过一些高级特性,比如共享内存来避免开销过高带来的问题。但一般情况下,不建议使用这些高级特性。

在这里插入图片描述
第五章:并发及并行(完)
下章见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值