并发并行操作基础小操作–python处理进程线程

1.多道操作系统:
对于cpu来说,它的计算效率是十分快的,它只有两种状态,要么是在工作,要么休息,而在一个进程中,若是存在阻塞,例如进行I/O操作,time.sleep(),网络通信有时造成的阻塞和申请缓冲区未被满足等等时候,这个时候cpu是不用进行计算的,那么与其任由cpu在这里休息,不如让他去处理其他的进程中需要cpu进行计算的地方,这个时候多道操作系统就有了用武之地,它在一个进程遇到阻塞的时候将cpu让出来,把cpu给另一个进程进行计算,由于cpu的计算速度远比进程进行I/O操作的速度要快,因此我们可以借此统筹计划来提升cpu的计算效率。
2.分时操作系统:
多道操作系统解决了一部分效率问题,而分使操作系统则可以使多个进程“同时运行”,它将cpu的计算时间分成几个细小的时间片,而每个正在运行的进程都会有三个状态:就绪,运行,阻塞。当os接受到一个进程开启的命令,并分配好一快内存空间及其他一些资源时,这个进程就进入了就绪状态,它被送入就绪队列,等待cpu执行它,cpu会对就绪队列中的进程进行计算等操作,从第一个进程开始,每个进程执行一个时间片,当一个时间片执行完了此进程仍未处理完,或是此时间片处理过程中遇到了阻塞时,则它重新进入就绪队列,等待下一个轮到它的时间片。这种操作系统其实并不能提升cpu的效率,但是却能给用户带来多个进程同时运行的体验。由于时间片一般极为短小,所以用户感觉不出。
了解以上这些操作系统处理进程的机制后,就有了用python处理进程的基础。
1.开启多个子进程
我们把它导入后就可以利用它们处理进程的函数与类来与进程打交道了。
在这里插入图片描述

可见利用multiprocessing模块中的Process类即可创建进程实例,实例化该类时,会创建以此程序为父进程的子进程,子进程的内存空间里拥有父进程中定义的内容,将想要子进程运行的代码封装为一个函数作为target参数的值,并start它即可使创建出来的子进程运行它。当然这个子进程的代码相对于父进程代码是异步非阻塞的,但是也可以变为阻塞的,就是Process实例的join方法。如上图第18行注释。
3.进程间的信息交流
进程之间的内存是隔离的,当我们开启子进程时为他开辟了一快内存,这些资源是由父进程在结束前负责回收的,因此,它们之间的信息交流,需要一些其他的特殊方法。大致有如下5种方法来进行进程间的信息交流:
1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
在这里我暂时选择了最简单的交流方式:队列
在这里插入图片描述
引入multiprocessing模块中的Queue类来创建队列,队列是一种先进先出的数据结构,此程序开启了消费者和生产者两个子进程,生产者生产的数据由消费者来处理,运行结果如下图:

在这里插入图片描述

可见信息在两个进程中间有了流通
最后是守护进程
在这里插入图片描述


如上图代码,在我开启的四个子进程中,实例属性deamon设置为True,则此进程即为父进程的守护进程,它会在父进程代码执行结束后结束,此时父进程可能没有结束,因为它还要负责收集其他子进程的占用的资源。守护进程可以用于网络通信开启多个子进程服务,也可以利用在父进程代码执行结束的特点来作为报告父进程是否执行结束的特征。
进程锁:
在这里插入图片描述
在这里插入图片描述

如图是一个锁的实例,最好的体现效果无法以图片的形式展示,这个锁锁住的代码只能一个一个执行,用于多个进程处理巨量数据共享时这是一个很好的保护措施,但是会使数据处理的速度变慢,遇到阻塞则尤为严重。

标签: 进程, python, 线程, cpu, 队列, 操作系统, 阻塞, 并行操作

相关文章推荐

添加新评论,含*的栏目为必填