并发编程 下
进程是计算机中资源分配的最小单元;一个进程中可以有多个线程,同一个进程中的线程共享资源;
进程与进程之间则是相互隔离。
Python中通过多进程可以利用CPU的多核优势,计算密集型操作适用于多进程。
关于在Python中基于multiprocessiong模块操作的进程:
fork ,【“拷贝”几乎所有资源】【支持文件对象/线程锁等传参】【unix】【任意位置开始】【快】
spawn ,【run参数传必备资源】【不支持文件对象/线程锁等传参】【unix、win】【main代码块开始】【慢】
forkserver ,【run参数传必备资源】【不支持文件对象/线程锁等传参】【部分unix】【main代码块开始】
官方文档:https://docs.python.org/3/library/multiprocessing.html
示例1
示例2
案例:
进程的常见方法:
进程是资源分配的最小单元,每个进程中都维护自己独立的数据,不共享。
如果想要让他们之间进行共享,则可以借助一些特殊的东西来实现。
Shared memory
Data can be stored in a shared memory map using Value or Array . For example, the following code【 数据可以使用Value或Array存储在共享内存映射中。 例如下面的代码 】
Server process
A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies.
【 manager()返回的管理器对象控制一个服务器进程,该进程保存Python对象,并允许其他进程使用代理操作这些对象。 】
multiprocessing supports two types of communication channel between processes
【 支持两种进程之间的通信通道 】
Queues
The Queue class is a near clone of queue.Queue . For example
Pipes
The Pipe() function returns a pair of connection objects connected by a pipe which by default is duplex (two-way). For example:
函数返回一对由管道连接的连接对象,该管道默认为双工(双向)。 例如:
上述都是Python内部提供的进程之间数据共享和交换的机制,作为了解即可,在项目开发中很少使用,后期项目中一般会借助第三方的来做资源的共享,例如:MySQL、redis等。
如果多个进程抢占式去做某些操作时候,为了防止操作出问题,可以通过进程锁来避免。
很显然,多进程在操作时就会出问题,此时就需要锁来介入:
注意:如果在进程池中要使用进程锁,则需要基于Manager中的Lock和RLock来实现。
暂时以了解为主。
计算机中提供了:线程、进程 用于实现并发编程(真实存在)。
协程(Coroutine),是程序员通过代码搞出来的一个东西(非真实存在)。
协程也可以被称为微线程,是一种用户态内的上下文切换技术。
简而言之,其实就是通过一个线程实现代码块相互切换执行(来回跳着执行)。
例如:
上述代码是普通的函数定义和执行,按流程分别执行两个函数中的代码,并先后会输出: 1、2、3、4 。
但如果介入协程技术那么就可以实现函数见代码切换执行,最终输入: 1、3、2、4 。
在Python中有多种方式可以实现协程,例如:
虽然上述两种都实现了协程,但这种编写代码的方式没啥意义。
这种来回切换执行,可能反倒让程序的执行速度更慢了(相比较于串行)。
协程如何才能更有意义呢?
通过上述内容发现,在处理IO请求时,协程通过一个线程就可以实现并发的操作。
现在很多Python中的框架都在支持协程,比如:FastAPI、Tornado、Sanic、Django 3、aiohttp等,企业开发使用的也越来越多(目前不是特别多)。