并发编程

阅读目录

理论知识

必备的理论基础:

一.什么是操作系统:

  管理且优化使用计算机硬件是一件非常繁琐的事情,程序员是无法把所有的硬件操作细节都了解到的,于是计算机安装了一层软件(系统软件),成为操作系统,用来管理计算机硬件,这样,程序员只需要考虑应用软件的编写,应用软件直接使用操作系统提供的功能间接使用硬件就可以了.
  所以,简单来说,操作系统就是一个协调,管理,控制计算机硬件资源和软件资源的控制程序.操作系统所处的位置如图:

 

二.操作系统的作用:

1.隐藏了丑陋复杂的硬件接口,提供了良好的抽象接口;

 例如,操作系统提供了文件这个抽象概念,对文件的操作就是对磁盘的操作,有了文件,我们就无序考虑对磁盘的读写控制.

2.将应用程序对硬件资源的竞争请求变得有序化

 例如,很多应用程序其实是共享一套计算机硬件.假如现在有三个应用程序都申请了打印机打印.那么a程序竞争到了资源就打印,b程序竞争到了就打印b的...,这就导致了无序.打印机可能一会儿打印一段a的内容,一会儿再打印c的内容.操作系统的一个功能就是让这种无序变得有序.

 

三.多道技术:

背景: 针对单核,实现并发

  现在的主机一般是多核,那么每个核都会利用多道技术.比如,有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个cpu的任意一个.

  

空间上的复用: 如内存中同时有多道程序;

时间上的复用: 复用一个cpu的时间片.

  强调: 遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,以便下次切换回来时,能基于上次切走的位置继续.

 进程

什么是进程

顾名思义,进程就是正在进行的程序.

详细来说:

第一,进程是一个实体.每一个进程都有自己的内存空间.
第二,进程是一个"执行中的程序".

 

 进程的调度

进程的调度算法:

1.先来先服务算法

2.短作业优先算法

3.时间片轮转法

4.多级反馈队列

进程的并行与并发

并发: 并发是指资源有限的情况下,两个进程交替使用资源.

并行:并行是指两个进程同时进行.例如多个cpu执行多个任务.

区别:

并行是从微观上来说的,也就是说同一时刻,有不同的程序在执行,这就需要有多个处理器.

并发是从宏观上来说的,同一时间段上有不同任务在执行,同一时刻只有一个任务.

同步异步阻塞非阻塞

程序的三状态: 就绪,执行,阻塞

同步: 一个任务的执行依赖另一个任务的完成.

异步: 一个任务的执行不依赖另一个任务的完成.

阻塞: 当进程不满足程序运行的条件时,进程就会进入等待状态,知道满足条件为止,这就是阻塞.

非阻塞: 除了阻塞,都是非阻塞.

  设置非阻塞: sk.setblocking(False)

在python程序中的进程操作

multiprocessing模块

process模块

 

p.start() : 启动进程,并调用该子进程中的p.run()
p.run() : 进程启动时运行的方法,正是它去调用target指定的函数,我们自定义中的类一定要实现该方法.
p.terminate() : 强制终止进程.
p.is_alive() : 判断进程是否还活着.如果p仍运行,返回True
p.join(timeout) : 主进程等待p终止,才会继续执行 
方法介绍

 

进程之间数据隔离

from multiprocessing import Process

def work():
    global n
    n=0
    print('子进程内: ',n)


if __name__ == '__main__':
    n = 100
    p=Process(target=work)
    p.start()
    print('主进程内: ',n)

进程之间的数据隔离问题

守护进程

守护进程只守护主进程,会随着主进程代码的结束而结束.

锁Lock,信号量Semaphore,事件Event

锁--multiprocessing.Lock

当多个进程使用同一份数据资源时,会引发数据安全问题,使用Lock,就将进程变成串行,保证了数据安全.

信号量-- multiprocessing.Semaphore

信号量就是: 锁+计数器

互斥锁同时只允许一个进程更改数据,而信号量是同时允许一定数量的进程更改数据.

事件-- multiprocessing.Event

event有一个默认的标识,默认为"False".
set: 将False设置为True.
clear: 将True设置False.
is_set: 判断是否为True.
wait: 标识为False,进入阻塞;标识为True,开始执行.
方法

进程间通信

IPC (Inter-Process-Communication)

实现IPC的方法:

  队列Queue :管道+锁

  管道Pipe :

进程池

定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务.池中进程的数量是固定的.

回调函数

什么是回调函数?

进程池中任何一个任务结束,就告知主进程,主进程再调用一个函数来处理该结果.

 

 线程

 

    

   

posted @ 2019-03-07 20:00  yara-ning  阅读(139)  评论(0编辑  收藏  举报