【并发编程Python】一文详解Python并发编程,协程、线程、进程

并发编程简介和一些前缀知识

        并发编程是使得程序大幅度提速的。在并发编程中,程序可以同一时间执行多个任务,这有助于提高程序的吞吐量和响应时间。并发编程设计的主要概念包括线程、锁、同步、信号量、进程间通信等。

前缀知识:

  • IO:电脑中的IO操作是指输入/输出操作,也称为I/O操作。它指的是计算机与外部设备(如键盘、鼠标、打印机、硬盘、光驱等)进行数据交换的操作。
  • CPU(中央处理器):是计算机中最重要的部件之一,它可以执行程序和指令,并控制和调度其他计算机组件的工作,以便完成各种任务。 
  • 显示的上下文切换:是指在多任务操作系统中,当一个线程被挂起(如等待 I/O 或者时间片到期)时,需要进行上下文切换来保存当前线程的状态并且启动下一个线程。这个过程需要进行显式的调用和处理,因为它需要保存当前线程的寄存器、堆栈等信息,并加载下一个线程的对应信息来继续执行。

【并发编程Python】一文详解Python并发编程,协程、线程、进程_第1张图片

  • 单线程串行:我们有一个空闲的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。它们各有各适用的场景,根据不同的任务可以选择最恰当的方式。

  • 多线程:多线程即多任务(同一个人一边听mp3一边写作业一边看电视),具体指在一个程序中同时运行多个线程,从而增加程序并发处理的能力。每个线程都可以独立地执行不同的代码任务,可以同时读取或者写入内存、调用函数、进程同步和通信等。多线程通过在多核处理器和单核处理器上分配应用程序的负载,提高了计算机系统的效率和性能。threading库,利用CPU和IO可以同时执行的原理,让CPU和IO可以并行。】
  • 多进程:多进程即多任务+每个任务用到的资源(不同的人和他们的器官,每一个人借着他们自己的器官又可以多任务),具体指在一个程序中同时运行多个独立的进程,每个进程可以拥有自己的地址空间、代码段和数据段等资源。multiprocessing库,利用多核CPU的能力,真正并行执行任务。】
  • 多协程|异步I/O:协程是一种轻量级的线程,它通过协作式多任务处理来实现并发。【asyncio库,在单线程的情况下利用CPU和IO同时执行的原理,实现函数异步执行。】

竞争中得真知:

  • 多进程与多线程的区别:与多线程相比,使用多进程可以更好地实现并行和分布式处理,同时从逻辑上划分模块,降低了程序的耦合性,提高了系统的可维护性和鲁棒性。例如,在计算密集型应用程序中,使用多进程可以将计算任务分配到多个进程中去处理,充分利用CPU资源,并且避免单点故障的风险。另外,多进程还可以提高程序的安全性和稳定性。由于每个进程都具有独立的内存空间,因此即使一个进程崩溃或者受到攻击,其它进程仍然可以正常工作。而且,通过设置合适的进程权限和访问控制,可以保护系统免受恶意软件和攻击的侵害。
  • 多协程与多线程的区别:与传统的线程相比,协程不需要进行显式的上下文切换和内存分配,因此相对更加高效且易于管理。协程常常用于处理 I/O 密集型应用程序,例如网络服务器、数据库、图像处理等等。这些应用通常会涉及到许多并发连接或请求,而 I/O 操作的等待时间也可能很长。在这种情况下,使用协程可以避免线程上下文切换和资源浪费,从而提高系统的吞吐量和响应速度。

额外函数辅助:

  • Lock:使用Lock对资源加锁,防止冲突访问。多线程/进程同时访问一个文件,同时写入/读取会导致冲突,在该文件正在被访问的时候锁起来,可以避免冲突。
  • Queue:使用Queue实现不同线程/进程之间的数据通信,实现生产者-消费者模式。用该模式优化爬虫,生产者-就是爬取数据,消费者就是解析数据,一边爬取一边解析实现提速。
  • Pool:使用线程池Pool/进程池Pool,简化线程/进程的任务提交、等待结束、获取结果。
  • subprocess:使用subprocess启动外部程序的进程,并进行输入输出交互。比如写好了一个.exe程序,使用该模块可以调起这个exe程序,和它进行IO交互,来实现交互式的进程通信。

1、三种并发机制较高下

【并发编程Python】一文详解Python并发编程,协程、线程、进程_第2张图片

  • 一个进程(multiprocessing)中可以启动并且包含很多个线程(Thread), 一个线程(Thread)中可以启动很多个协程(Coroutine),是一对多的关系。
  • 多进程是唯一一个可以调用多个CPU并行运算的方式。
  • 一个线程可以启动成千上万个协程,数量可以是极大量的,几乎没有限制的,而一个进程能调用的线程是有数量限制的。

2、如何择优!根据任务特点选择对应Python并发技术

一些必备的前缀知识:

  • CPU密集型计算(CPU-bound):CPU的限制,也叫计算密集型,是指I/O在很短的时间就可以完成,CPU需要大量的计算和处理,特点是CPU占用率相当高。例如:压缩解压缩、加密解密、正则表达式搜索。
  • IO密集型计算(I/O bound):IO密集型指的是系统运作大部分的状况是CPU在等待I/O(硬盘/内存)的读/写操作,CPU占用率仍然较低。例如:文件处理程序、网络爬虫程序,读写数据库程序。

【并发编程Python】一文详解Python并发编程,协程、线程、进程_第3张图片

  1. 对待执行任务来说,先看一下任务的特点,如果是CPU密集型的话,不用考虑太多,直接选用多进程multiprocessing来解决任务;
  2. 如果是IO密集型任务的话,就有两种选择,多协程是一种比较新的技术,相比于多线程会有很多优势,但同时也有很多限制,如果能任务能满足多协程的限制,那就自然的选择多协程,不然选择多线程

3、牛刀小解

  1. 多进程:打开多个浏览器实例可以看作是在操作系统中创建了多个独立的进程,每个进程都拥有自己的内存空间、资源和运行环境。例子:打开、Edge和Chorm,相当于创建了两个进程。
  2. 多线程:在同一个浏览器中,打开或者创建多个窗口或标签页可以看作是进程内的创建了多个线程,每个线程都用于处理用户请求、加载页面、渲染内容等任务,例子:用多个线程放入同一个浏览器的多个标签页或者窗口,然后多个线程同时运行。
  3. 多协程:浏览器中的 Web Workers 可以视为使用多个协程的例子。Web Workers 允许在后台运行 JavaScript 代码,从而可以在浏览器的主线程之外创建额外的线程。这些额外的线程可以在与主线程不同的协程中执行任务,以提高并发能力和性能。

你可能感兴趣的:(Python开发工程师,#,并发编程技术,数据库,开发语言,并发编程,python)