并发编程简介和一些前缀知识
并发编程是使得程序大幅度提速的。在并发编程中,程序可以同一时间执行多个任务,这有助于提高程序的吞吐量和响应时间。并发编程设计的主要概念包括线程、锁、同步、信号量、进程间通信等。
前缀知识:
- IO:电脑中的IO操作是指输入/输出操作,也称为I/O操作。它指的是计算机与外部设备(如键盘、鼠标、打印机、硬盘、光驱等)进行数据交换的操作。
- CPU(中央处理器):是计算机中最重要的部件之一,它可以执行程序和指令,并控制和调度其他计算机组件的工作,以便完成各种任务。
- 单线程串行:我们有一个空闲的CPU,遇到了CPU执行的操作,CPU开始工作,停止接收其他操作,等待CPU工作完,遇到IO执行的操作,开始IO工作。
- 多线程并发:我们有一个空闲的CPU,遇到了CPU执行的操作,CPU开始工作,工作一会儿,遇到IO执行操作,IO操作同时工作...,【threading库】
- 多CPU并行: 我们有多个空闲的CPU,遇到了CPU执行的操作,其中一个空闲的CPU①开始工作,期间又遇到了CPU执行的操作,另外一个空闲的CPU②开始工作,工作一会儿,CPU①工作完毕,遇到IO执行的操作,IO开始工作,同时CPU②依旧在工作...,【multiprocessing】
- 多机器并行:我们有多个机器,每个机器都有一个或者多个CPU,多个机器共同执行一个任务,原理如上面几点...【大数据组件:hadoop/hive/spark】
Python并发编程
Python并发编程有三种方式:多线程Thread、多进程Process、多协程Coroutine。他们各有各适用的场景,根据不同的任务可以选择最恰当 的方式。
- 多线程:threading库,利用CPU和IO可以同时执行的原理,让CPU和IO可以并行。
- 多进程:multiprocessing库,利用多核CPU的能力,真正并行执行任务。
- 异步IO:asyncio库,在单线程的情况下,利用CPU和IO同时执行的原理,实现函数异步执行。
额外函数辅助:
- Lock:使用Lock对资源加锁,防止冲突访问。多线程/进程同时访问一个文件,同时写入/读取会导致冲突,在该文件正在被访问的时候锁起来,可以避免冲突。
- Queue:使用Queue实现不同线程/进程之间的数据通信,实现生产者-消费者模式。用该模式优化爬虫,生产者-就是爬取数据,消费者就是解析数据,一边爬取一边解析实现提速。
- Pool:使用线程池Pool/进程池Pool,简化线程/进程的任务提交、等待结束、获取结果。
- subprocess:使用subprocess启动外部程序的进程,并进行输入输出交互。比如写好了一个.exe程序,使用该模块可以调起这个exe程序,和它进行IO交互,来实现交互式的进程通信。
1、三种并发机制较高下
- 一个进程(multiprocessing)中可以启动并且包含很多个线程(Thread), 一个线程(Thread)中可以启动很多个协程(Coroutine),是一对多的关系。
- 多进程是唯一一个可以调用多个CPU并行运算的方式。
- 一个线程可以启动成千上万个协程,数量可以是极大量的,几乎没有限制的,而一个进程能调用的线程是有数量限制的。
2、如何择优!根据任务特点选择对应Python并发技术
一些必备的前缀知识:
- CPU密集型计算(CPU-bound):CPU的限制,也叫计算密集型,是指I/O在很短的时间就可以完成,CPU需要大量的计算和处理,特点是CPU占用率相当高。例如:压缩解压缩、加密解密、正则表达式搜索。
- IO密集型计算(I/O bound):IO密集型指的是系统运作大部分的状况是CPU在等待I/O(硬盘/内存)的读/写操作,CPU占用率仍然较低。例如:文件处理程序、网络爬虫程序,读写数据库程序。
- 对待执行任务来说,先看一下任务的特点,如果是CPU密集型的话,不用考虑太多,直接选用多进程multiprocessing来解决任务;
- 如果是IO密集型任务的话,就有两种选择,多协程是一种比较新的技术,相比于多线程会有很多优势,但同时也有很多限制,如果能任务能满足多协程的限制,那就自然的选择多协程,不然选择多线程。