俄罗斯贵宾会-俄罗斯贵宾会官网
做最好的网站

Python多进程与服务器并发原理及使用教程

计算机硬件组成

  主板    固化(寄存器,是直接和cpu进行交互的一个硬件)

  cpu     中央处理器:计算(数字计算和逻辑计算)和控制(控制所有硬件协调工作)

  存储    硬盘,内存

  输入设备  键盘,鼠标,话筒

  输出设备  显示器,音响,打印机等

 

本文实例分析了Python多进程与服务器并发原理及用法。分享给大家供大家参考,具体如下:

计算机发展史

 

第一代计算机:电子管计算机:及其耗电体积庞大,散热量特别高

第二代计算机:晶体管计算机,

第三代计算机:白色大头计算机,集成电路计算机,一个板子固化几十到上百个小硬件

第四代计算机:大型集成电路计算机,一个班子可以固化十万个硬件

第五代计算机:甚大型集成电路计算机

早期计算机是以计算为核心的

现在计算机是以存储为核心的

 

进程

计算机的操作系统

  操作系统是一个软件,是一个能直接操纵硬件的软件.

  微软研发的windows操作系统.

人工时代:穿孔打带

  每个人都能自己在一段时间内独享计算机所有资源

脱机时代:完全将人和机器隔离开来

单道批处理系统:内存中只允许存放一道作业.

多道批处理系统;内存中允许存放多到作业

 

分时系统:将cpu的执行划分时间片,每个程序以时间片为单位去执行.

实时系统:一般比较少见,主要用于军事和工业生产上.

 

dos系统    单用户单任务    纯编程系统

Windows系统  单用户多任务(早期的Windows系统)

unix系统    多用户多任务

 

为什么要有操作系统?

  1.封装了所有硬件的接口,使用户更方便的使用

  2.对于计算机内所有资源,进行一个合理的调度和分配

 

无论什么时候 ,操作系统的目标总是:让用户用起来更加的轻松.高可用,低耦合.

 

什么是进程

语言的发展史:

  计算机识别的是二进制

    机器语言:由1和0组成代码

    汇编语言:add n,m  move n,m

    高级语言:面向过程的语言(c),面向对象的语言(c++.java,python,.net,php)

 

进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。

进程的理论

   .sh    shell脚本文件

  .out    linux系统中的可执行文件

  .bat    批处理脚本文件

  .lib      库文件

  .exe    可执行文件,双击就能运行的文件

 

    进程:

     是指正在执行的程序.

       是程序执行过程中的一次指令,数据集等的集合

       也可以叫做程序的一次执行过程.

       进程是一个动态的概念.

 

进程由三大部分组成:代码段,数据段,pcb:进程管理控制

进程的三大基本状态:

  就绪状态;已经获得运行需要的所有资源,除了cpu

  执行状态:已进获得所有资源,包括cpu,处于正在运行

  阻塞状态:因为各种原因,进程放弃了cpu,导致进程无法继续执行,此时进程处于内存中,继续等待获取cpu进程的一个特殊状态:

    挂起状态:是指因为各种原因,进程放弃了cpu,导致进程无法继续执行,此时进程被踢出内存.

 

进程与程序的区别

多进程和多进程的相关的常用方法

 

    并行:并行是指两者同时执行,比如有两条车道,在某一个时间点,两条车道上都有车在跑;(资源够用,比如三个线程,四核的CPU )

  并发:并发是指资源有限的情况下,两者交替轮流使用资源,比如只有一条车道(单核CPU资源),那么就是A车先走,在某个时刻A车退出把道路让给B走,B走完继续给A ,交替使用,目的是提高效率。

区别:

  并行是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器。
  并发是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个session。

  注意:早期单核CPU时候,对于进程也是微观上串行(站在cpu角度看),宏观上并行(站在人的角度看就是同时有很多程序在执行)。

 

  同步:所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。

  异步:所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列

 

  阻塞与非阻塞

    阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的

  

程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。

进程的相关操作

并发与并行

  multiprocessing模块:

    仔细说来,multiprocessing不是一个模块而是python中一个操作、管理进程的包。 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块。由于提供的子模块非常多,为了方便大家归类记忆,我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。

无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务

  进程的开启方法:

    1.p = Process(target = None,args(,))   

def func(i):
    time.sleep(1)
    print('这里是儿子进程,儿子自己的pid是%s,儿子的父进程的pid是%s'%(os.getpid(),os.getppid()))

# os.getpid()获取的是当前进程自己的pid
# os.getppid()获取的是当前进程的父进程的pid
if __name__ == '__main__':
    p = Process(target=func,args=(1,))# 实例化一个进程对象
    p.start()# 开启一个子进程
    print('这里是父亲进程,父进程自己的pid是:%s,父亲的父亲的pid是%s'%(os.getpid(),os.getppid()))

    2.自定义类,继承process父类

class MyProcess(Process):
    def __init__(self):
        super(MyProcess, self).__init__()
    def run(self):
        print('这是以继承类的方式开启的子进程')

if __name__ == '__main__':
    p1 = MyProcess()
    p1.start()# 是指,解释器告诉操作系统,去帮我开启一个进程,   就绪状态

一 并发:是伪并行,即看起来是同时运行。单个cpu+多道技术就可以实现并发,(并行也属于并发)

  进程的常用方法:

    1.start()  开启一个子进程

    2.join()    异步变同步(就是让父类进程停留在join这句话,等待子进程执行结束,父进程在继续执行)

    3.is_alive()  判断进程是否还活着.

    4.terminate  杀死进程 

二 并行:同时运行,只有具备多个cpu才能实现并行

  进程的常用属性:

    1.p.name =     给p进程一个名字

    2.p.pid       返回p进程的pid

    3.p.daemon = True  将p进程设置为守护进程.(True为守护进程,False为普通进程)

单核下,可以利用多道技术,多个核,每个核也都可以利用多道技术(多道技术是针对单核而言的

      守护进程的两个特点:

        守护进程会随着父进程的结束而结束

        守护进程不可以再创建子进程(不能要孩子)

 

有四个核,六个任务,这样同一时间有四个任务被执行,假设分别被分配给了cpu1,cpu2,cpu3,cpu4,

一旦任务1遇到I/O就被迫中断执行,此时任务5就拿到cpu1的时间片去执行,这就是单核下的多道技术

而一旦任务1的I/O结束了,操作系统会重新调用它(需知进程的调度、分配给哪个cpu运行,由操作系统说了算),可能被分配给四个cpu中的任意一个去执行

同步与异步

同步执行:一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行

异步执行:一个进程在执行某个任务时,另外一个进程无需等待其执行完毕,就可以继续执行,当有消息返回时,系统会通知后者进行处理,这样可以提高执行效率

举个例子,打电话时就是同步通信,发短息时就是异步通信。

进程的创建

但凡是硬件,都需要有操作系统去管理,只要有操作系统,就有进程的概念,就需要有创建进程的方式,一些操作系统只为一个应用程序设计,比如微波炉中的控制器,一旦启动微波炉,所有的进程都已经存在。

而对于通用系统(跑很多应用程序),需要有系统运行过程中创建或撤销进程的能力,主要分为4中形式创建新的进程

1. 系统初始化(查看进程linux中用ps命令,windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在后台并且只在需要时才唤醒的进程,称为守护进程,如电子邮件、web页面、新闻、打印)

2. 一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)

  1. 用户的交互式请求,而创建一个新进程(如用户双击暴风影音)

  2. 一个批处理作业的初始化(只在大型机的批处理系统中应用)

无论哪一种,新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的:

1. 在UNIX中该系统调用是:fork,fork会创建一个与父进程一模一样的副本,二者有相同的存储映像、同样的环境字符串和同样的打开文件(在shell解释器进程中,执行一个命令就会创建一个子进程)

2. 在windows中该系统调用是:CreateProcess,CreateProcess既处理进程的创建,也负责把正确的程序装入新进程。

关于创建的子进程,UNIX和windows

1.相同的是:进程创建后,父进程和子进程有各自不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离),任何一个进程的在其地址空间中的修改都不会影响到另外一个进程。

2.不同的是:在UNIX中,子进程的初始地址空间是父进程的一个副本,提示:子进程和父进程是可以有只读的共享内存区的。但是对于windows系统来说,从一开始父进程与子进程的地址空间就是不同的。

进程的终止

本文由俄罗斯贵宾会发布于编程,转载请注明出处:Python多进程与服务器并发原理及使用教程

您可能还会对下面的文章感兴趣: