pythonweb-fork以及僵尸进程

  1. poll 方法实现IO多路复用

    p = poll()
    p.register()
    p.unregister()
    p.poll()

  2. epoll方法实现IO多路复用

    • 效率更高
    • 触发方式更多
    • 监控IO数量更多
  3. struct模块使用
    功能 : 将python数据转换为字节串,将字节串解析为python数据

    Struct(fmt) 生成数据的结构对象
    pack() 将数据打包为bytes
    unpack() 将数据解析

  4. 本地套接字

    作用 : 用于两个本地进程间通信

  5. 多任务编程

    什么是多任务编程?
    什么是并行,什么是并发

  6. 进程

    什么是进程?
    进程概念

  7. 基于fork的多进程并发


一. 基于fork的多进程编程(续)

  1. fork的运行特征
* 子进程会复制父进程的全部内存空间,从fork的下一句开始执行
* 父子进程各自独立运行,执行顺序不确定
* 通常情况下fork与if结构是固定搭配,利用父子进程中fork的返回值差异使其各自执行不同的内容
* 父进程在fork之前开辟的内存空间子进程同样会拥有,父子进程各自对各自空间的操作互不影响
* 父子进程有各自的特征,比如PID PCB 命令集。

二. 进程相关函数

  1. os.getpid()
    功能 : 获取当前进程的PID号
    返回值: 返回PID

  2. os.getppid()
    功能: 获取父进程的PID号
    返回: 返回PID

  3. os._exit(status)
    功能: 结束一个进程
    参数: 进程的退出状态 整数

  4. sys.exit([status])
    功能: 结束一个进程
    参数: 整数表示进程退出状态 默认为0
    字符串则表示进程退出时打印内容

三. 孤儿和僵尸

  1. 孤儿进程 :父进程先于子进程退出,此时子进程成为孤儿进程
 特点: 孤儿进程会被系统进程收养,此时系统进程就会成为孤儿进程新的父进程。
  1. 僵尸进程 :子进程先于父进程退出,父进程又没有处理子进程的退出状态,此时子进程就会成为僵尸进程。
 特点: 僵尸进程虽然已经结束,但是会存留部分信息在PCB中,大量的僵尸进程会浪费系统内存资源。
  1. 如何避免僵尸进程

    【1】 使用wait函数处理子进程退出状态

    pid,status = os.wait()
    

    功能:父进程中阻塞等待处理子进程的退出
    返回值:pid 退出的子进程的PID号
    status 子进程退出状态

    pid,status = os.waitpid(pid,option)
    

    功能:父进程中等待处理子进程的退出
    参数:pid -1 表示等待任意子进程退出
    >0 表示等待指定的子进程退出
    option 0 表示阻塞等待
    WNOHANG 表示非阻塞

    返回值:pid 退出的子进程的PID号
    status 子进程退出状态

    【2】 创建二级子进程处理僵尸

    1. 父进程创建子进程,等待回收
    
    1. 子进程创建二级子进程后立即退出
    2. 二级子进程成为孤儿,和原父进程一同执行事件

    【3】 通过信号处理子进程退出

    原理 :子进程退出时会由操作系统给父进程发送信号,如果父进程忽略这个信号则子进程的退出由操作系统自动处理。

 方法 :使用signal模块忽略信号
  
    import  signal
    signal.signal(signal.SIGCHLD,signal.SIG_IGN)
     
 * 在父进程中添加如上语句,则该父进程所有的子进程退出均由操作系统处理

四. 群聊聊天室

  1. 功能 : 类似qq群聊功能

    【1】 有人进入聊天室需要输入姓名,姓名不能重复

    【2】 有人进入聊天室,其他人会收到通知

      xxx 进入了聊天室
    

    【3】 一个人发消息,其他人会收到消息

          xxx :xxxxxxx
    

    【4】 有人退出聊天室,其他人也会收到通知

      xxx 退出了聊天室
    

    【5】 扩展功能 : 服务端消息公告,服务端发送消息所有人都能收到

     管理员消息:xxxxxxxxx
    
  2. 确定技术模型

    【1】 服务端和客户端,服务端处理请求,发送管理员消息
    客户端执行各种功能

    【2】 套接字选择 : UDP套接字

    【3】 消息发送模型 : 转发
    客户端 --》 服务端 --》其他客户端

    【4】 存储用户信息 {name:addr}

    【5】 处理收发关系 : 多进程分别处理收发

  3. 注意事项

    【1】 设计封装方案
    【2】 写一个功能模块测试一个模块
    【3】 注意注释的添加

  4. 具体实现流程

    【1】 搭建网络模型
    【2】 进入聊天室

    1. 客户端 : * 输入姓名

      • 发送给服务器
      • 接收服务器反馈
      • 不允许则重新输入,允许则进入聊天室
      • 创建新的进程用于消息收发
    2. 服务端 : * 接收姓名
      * 判断是否允许进入

      • 将结果反馈给客户端
      • 如果不允许则结束,允许将用户插入数据结构
      • 给其他人发送通知

    【3】 聊天

    1. 客户端 : * 循环发送消息
      * 循环接收消息
    2. 服务端: * 接收消息,判断消息类型
      * 将消息转发

    【4】 退出聊天室
    【5】 管理员消息

作业 : 1. 将现有聊天室代码整体
2. 尝试自己完成剩余功能
3. fork进程整理,能够掌握运行原理
4. 类的设计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值