• Python网络编程(epoll内核监听,多任务多进程)


    OJBK 
     
    接着昨天的说 select模块内的epoll函数还没说  说完epoll和本地套接字套接字基本就没了
    今天主要是多进程   理论性东西比较多  主要是理解
     
     
    393ed93e71bf4d0fbad50ed019b35bcd_th.jpg
     
     
    epoll
    •     使用方法:代码与poll基本一致(Python语言中)
    •     将生产的对象改为 epoll = epoll()
    •     将关注事件类别名改为epoll的关注事件类别
             epoll基本所有的方法和常量都一致  再原poll的常量名前加个E
             创建方法改为 epoll()就可以了  这种情况只在Python中才会这么简单
             epoll在别的语言实现比python要复杂的多
        区别:
              epoll 效率要高于select 和 poll
              epoll 的触发机制更多  EPOLLET(边缘触发)
              边缘触发是什么?
                       这就是epoll和poll的区别所在了 为什么说epoll效率会高呢
                       因为epoll的触发机制是在内核中直接完成整个功能 那个事件准备就绪我就直接返回这个IO事件
                       而poll的触发方式是什么呢 是我什么时候有IO准备就绪了我就把整所有的事件都返回
                      返回到应用层后再次做筛选处理  即使你的计算很快 也是会浪费很多事件去处理
     
    Linux下文件类型:
          bcd -lsp
             b(快  设备文件)
             c(字符设备文件)
             d(目录)
             -(普通文件)
             l(链接文件)
             s(套接字文件)
             p(管道文件)   
                  
    本地套接字:
       
       作用:
          用于本地文件不同程序间进行数据传输
       本地套接字传输流程:
          1.创建本地套接字对象
              sockfd = socket(AF_UNIX, SOCK_STREAM)
          2.绑定套接字文件,如果文件不存在则自动创建 存在则报错
             sockfd.bind(file)
          3.监听
             listen
          4.消息收发
             recv send
     
     
    os.path.exists(file)
       功能:判断一个文件是否存在
       参数:文件名
       返回值:bool
     
    os.remove()
    os.unlink()
       功能:删除文件
       阐述:要删除的文件
     
     
     
     
    网络基础总结:
       理论:
         1.OSI七成模型  tcp/ip模型
         2.tcp 和 UDP的区别和特性
         3.三次握手和四次挥手的过程和每一次的作用
         4.什么是IO多路复用
         5.套接字的种类,套接字类型的区别
       程序实践;
         1.tcp套接字传输的基本模型
         2.udp套接字传输的基本模型
         3.IO多路复用select、poll
         4.HTTP协议基本原理的时间
     
    多任务编程:
       意义:
         充分利用计算机资源,同时运行多个任务,
         提高程序整体的运行效率
       定义:
         通过程序利用计算机的多个核心达到同时执行多个任务的目的
         因此达到提升程序运行效率的目的
       实施方案:
         多进程编程
         多线程编程
         并行:
            多个计算机核心在同时处理多个任务,
    这时多个任务之间是并行关系
         并发:
            同时运行多个任务,内核在多个任务之间的不断切换,
    达到多个任务都会执行的处理效果
    此时多个任务之间是并发关系
     
    进程:
        程序在计算机中的一次执行过程
     
    程序:
        是一个可执行文件,是静态的,只占有磁盘
        不占用计算机运行资源
    进程:
        是一个动态过程,占有一定的计算机资源
        有一定的生命周期
    注:
        同一个程序不同的运行过程是不同的进程,
        因为分配的资源和生命周期都不同
     
    进程的创建过程:
        1.用户启动一个程序,或是调用接口发起进程创建
        2.操作系统接收用户请求分配计算机资源创建进程
        3.操作系统将一定状态的进程提供给用户使用
        4.用户利用操作提供的进程完成任务
    CPU时间片:
        如果有个进程占有CPU此时我们称为该进程占有CPU的时间片
        多个进程任务或轮流占有CPU时间片并形成并发效果
      
    进程信息(process)
        PCB(进程控制块):
             进程创建后 会自动在内存中产生一个空间存放进程信息
        进程信息:
            进程ID 进程占有内存的位置  创建时间、创建位置
    查看系统进程信息:ps -aux
        PID(process ID):
          在操作系统中每个进程都有唯一的PID值是由系统分配的
    进程特征:
        进程是操作系统分配资源的最小单元
        每个进程拥有自己独立的运行空间(4个G的虚拟内存空间)
        进程之间相互独立各不影响
    进程的状态:
        三态:
        就绪状态:
             进程具备执行条件,等待系统分配处理器资源进入运行态
        运行态:
             进程占有CPU处于运行状态
        等待态:
             进程暂时不具备运行条件,需要阻塞等待
     
        五态:
             在三态的基础上增加新建和终止态 
     新建:
       创建一个新的程序,获取系统资源的过程
     终止:
       进程执行结束,释放资源的过程
     
    ps -aux   查询结果的 STAT表示进程状态:
        D  等待态  阻塞  不可中断等待态
        S  等待态  睡眠  可中断等待态
        T  等待态  暂停  暂停执行
        R  运行态(就绪态)
        Z  僵尸
          +  前台进程(在终端运行)
          <  有较高优先级的进程
          N  较低优先级的进程
           s  回话组
           l  有子进程链接
    进程的优先级:
        top 查看进程运行态优先级
        取值范围:-20~19   -20最高
        nice:
           以指定的优先级运行一个程序
           nice -9 ./hello.py  以9的优先级运行
           sudo nice --9 ./hello.py 以-9优先级运行
     
        首行添加 #! /usr/bin/python3  指定执行器
          执行:./hello.py
        修改程序权限添加可执行权限
             chmod    775     hello.py
     
    父子进程:
        在系统中除了初始化进程外每个进程都有一个父进程,可能有0个或多个子进程
        由此行成进程间的父子关系
        便于进程管理,父进程发起创建进程请求
        查看进程树:pstree
        查看父子进程ID:ps -ajx
     
     
     
    os.fork 创建进程
        pid = os.fork()
            功能:创建进程
            返回值:
        失败:返回一个负数
        成功:
           在原有进程中返回新有进程PID号
           在新进程中返回0
    子进程会复制父进程内部全部内存空间包括代码段
    子进程会从fork的下一句开始执行
    父进程中fork返回值即为新创创建子进程的PID号
    使用if语句结构使父子进程进行不同代码段的运行
    在子进程中对变量等其他内容的修改, 不会影响父进程中的内容
    子进程虽然复制父进程内容,但是也有自己的特有属性特征
      如:PID号  PCB  内存区间
     
    获取进程的PID
      os.getpid()
         功能:获取进程的PID号
         返回值:返回进程的PID号
      os.getppid()
         功能:获取父进程的PID
         返回值:返回父进程的ID号
    进程退出:
      os.exit(status)
        功能:退出一个进程
        参数:进程的退出状态  整数
      sys.exit([status])
        功能:退出一个进程
        参数:默认为0
              如果传入一个整数如同_exit()
      传入一个字符串,则在退出时打印该字符串
        sys.exit() 可以通过捕获 SystemExit异常退出
     
     
     
     
    什么是进程 进程和程序的区别?
         进程是一种动态描述 是程序运行的一次过程
         进程是程序在运行过程中的形态 它占有一定的独立内存空间
         进程占用CPU及系统资源  而程序不会 程序是静态的 它只会占用磁盘空间
     
    进程的特征和基本概念?
            进程是计算机内存资源分配的最小资源
            每个进程在内存中都有各自各自独立的运行空间
            并且每个进程之间互不影响
     
    并发并行的区别?
    并行是不同系统核心同时进行进程的运行 两个进程之间的关系叫做并行
    并发是同一个系统核心进行轮流切换进程的过程叫做并发
    并行是有多个进程同时运行 而并发只能同时运行一个进程
     
     
    进程 fork理解?
    •      进程fork是一个创建子进程的os模块函数
    •      他能够在只运行一个程序的情况下 创建多个进程并运行
    •      创建出来的进程叫做该进程的子进程 并且子进程与父进程是并发运行
    •      谁先占有资源谁先运行 没有顺序之分
    •      创建子进程有三个结果创建失败返回负数、成功返回0、正数(代表原有进程ID)
    •      如果创建子进程成功 返回值为该子进程的ID 并且在该子进程中返回0
    •      其实就是创建成功时返回原进程ID 当子进程独立运行时在子进程内返回0
    •      子进程创建成功后悔会在内存中开辟以个新的空间 此空间内的所有代码和参数
    •      都会复制父进程的   但是有自己的进程属性  是独立进程  子进程的所有操作不会影响父进程
    •      在创建子进程后运行位置是从fork函数return后开始执行的
    •      利用if结构就能达到多进程同时运行同程序内的不同代码段
    •      这样就能大大提高程序的执行效率

    由此可以看出:

    import os
    import time
    pid = os.fork()
    
    if pid < 0:
        print("失败")
    elif pid == 0:
        print("成功")
        print(pid)
        time.sleep(2)
        print(pid)
    else:
        time.sleep(5)
        print("原进程")
        print(pid)

  • 相关阅读:
    生产上第一使用线程池后的总结与反思
    20190407
    20190403
    Asp.net MVC中的ViewData与ViewBag
    easyui datagrid分页
    EF从数据库更新模型更新不到新表
    C语言 笔记(函数)
    python 写100~1000以内水仙花数
    python 求前n项阶乘的和
    python 写九九乘法表
  • 原文地址:https://www.cnblogs.com/ParisGabriel/p/9452653.html
Copyright © 2020-2023  润新知