python 小知识 - 并发编程(1)
1. 并发基础概念
可以说,任何一种高级语言都会涉及到并发编程;我们都能说出并发的最大好处:可以提高程序的执行的效率;
并发简单的说就是利用多个资源同时执行多个小的任务,以提供大的任务的执行耗时; 这和分布式计算有点类似,分布式也是一种并发,只不过可利用的资源不只是单机的资源,而是有网络连接的计算机集群,当然这就增加了机器之间网络传输的开销,同时要处理更多有传输异常导致的异常容错处理机制。
并发通常会涉及到两个概念:线程和进程;
线程和进程有什么区别?划重点
首先,进程(Process)是操作系统中最小资源管理单元,一个进程拥有独立的代码、数据和内存空间,是应用程序启动的一个实例;你只要在系统中执行一个程序(比如 py 代码),操作系统都会分配相应的资源来执行,执行完成会回收资源, 如果进程使用资源威胁到整个操作系统(比如内存飙升到 99%),操作系统会强杀它。也就是资源是收操作系统控制的。
其次,进程下面允许有多个任务执行单元,这个任务执行单元就是线程(thread);同时线程有不同的状态(如创建,可运行,运行中,阻塞,死亡)。线程的状态控制也是由操作系统控制。
当然还有一个协程的概念;进程和线程的资源控制是操作系统的分配,对于单核 cpu 来说,多个线程轮流的获取的 cpu 的使用权,达到并发的目的。协程的一个特点是资源是控制权在于设计者手上,协程在线程下面,也是并发编程的一个组成部分。
从上面的说明,我们可以总结下:
进程下面有线程,线程下面有协程
进程和进程之前的资源是独立的
而同一个进程下的多个线程是共享资源,比如数据和内存空间等
同时线程共享同一个资源,多个线程同时改变资源时,就会出现不一致性,这个时候考虑锁,独占资源
通常情况下,分布式计算都是多个进程的方式,就如上面总结的,进程之间资源是独立的,就会有一个共享资源的机制来负责进程之间数据的共享和传递(通常由 master 类的角色完成),这个在 python 多进程并行处理会涉及,区别是如何实现共享数据的处理。
我觉得,理解上面的基础概念是非常重要的,它们是并发编程的底层逻辑,是所有并发编程的基础。
2. 如何并发编程
用一个 python 的多线程的方式来说明如何并发编程?
python 中的 concurrent.futurest 提供了 ThreadPoolExecutor 线程池来创建线程池
通过 map 把每个任务分配给执行函数执行
并返回结果
with 来管理线程池的关闭
从上面例子,我们需要知道:
并发编程的关键是编写一个任务的处理逻辑
更重要的是如何将一个大任务拆分从小任务,比如前面例子中的 files 列表大任务,每个列表中的值就是一个小任务。
并发编程的关键:拆分任务,发起线程或者进程执行小任务,合并小任务结果大任务返回结果(如果需要返回任务的情况)。
希望今天的分享对你有帮助。
接下来的部分,我们将来了解 python 并发的特性,以及线程和多进程开发,敬请期待。
版权声明: 本文为 InfoQ 作者【AIWeker】的原创文章。
原文链接:【http://xie.infoq.cn/article/6a8d7d65945149725923afd8c】。文章转载请联系作者。
评论