• python网络编程 day33 网络编程——进程拾遗,互斥锁(重要)生产者消费者模型


    一、内容回顾

    • 概念

      • 同步阻塞 :调用一个函数需要等待这个函数的执行结果,并且在执行这个给函数的过程中CPU不工作 # input('>>>>')

      • 同步非阻塞:调用一个函数需要等待这个函数的执行结果,并且在执行这个给函数的过程中CPU工作 # ret = eva('1+2-3+4-5+6')

      • 异步非阻塞:调用一个函数不需要等待这个函数的结果,并且在执行这个函数的过程中,CPU工作 # start()

      • 异步阻塞 :调用一个函数不需要等待这个函数的结果,并且在执行这个函数的过程中,CPU不工作

    • 进程的三状态图

    1611278644554

    • 进程的调度算法

      • 先来先服务

      • 短作业优先

      • 分时的概念

      • 多级反馈算法(包含了上面三个)

    • 进程的开启和关闭

      • 父进程开启了子进程

      • 父进程要负责给子进程回收子进程结束后的资源

    • join 等待子进程执行完后,在执行主进程内的内容

     

    二、今日内容

    1、Process类拾遗

    • 开启进程的另一中方法

      • 继承Process类,并实现Process类的同名方法:run()

    • Process类的一些其他方法属性

      • p.pid 子进程的pid

      • p.join

      • p.ident 和p.pid一样

      • p.name 子进程的名字

      • p.terminate() 强制结束一个子进程 异步非阻塞

      • p.is_alive() 查看进程是否还存在 返回True或False

    • 守护进程

      • 子进程会等待所有的子进程结束,是为了回收子进程的资源

      • daemon = True 表示设置子进程是一个守护进程

      • 守护进程会等待主进程的代码执行结束之后再结束,而不是等待整个主进程结束.

      • 主进程的代码什么时候结束,守护进程就什么时候结束,和其他子进程的执行进度无关

        import time
        from multiprocessing import Process

        def son1():
           while True:
               print('--> in son1')
               time.sleep(1)

        def son2():   # 执行10s
           for i in range(10):
               print('in son2')
               time.sleep(1)

        if __name__ == '__main__':    # 3s
           p1 = Process(target=son1)
           p1.daemon = True    # 表示设置p1是一个守护进程
           p1.start()
           p2 = Process(target=son2,)
           p2.start()
           time.sleep(3)
           print('in main')

         

    2、进程同步 ——lock锁 非常重要

    • 互斥锁:不能再同一个进程中i连续acquire

    • with lock: # 代替acquire和release 并且在此基础上做一些异常处理,保证即便一个进程的代码出错退出了,也会归还钥匙

     

    3、队列

    • 进程之间数据是隔离的

    • 进程之间通信 Inter Process Communication (IPC)

      • 基于文件:同一台机器上的多个进程之间通信

        • 基于socket文件级别的通信来完成数据之间传递

      • 基于网络:同一台机器或者多个机器之间的多进程之间通信

        • 第三方模块

        • memache

        • redis

        • rabbitmq

        • kafka

    • Queue

      队列:先进先出

    • 生产者消费者模型

      • 爬虫的时候

      • 分布式操作: celery 框架:框架本质是两个大的生产者消费者模型

      • 本质:就是让生产数据和消费数据的效率达到平衡并且最大化效率

        #生产者消费者模型
        import time
        from multiprocessing import Queue,Process
        def consumer(q,name):
           while True:
               food = q.get()
               if food:
                   print(f'{name}吃了一个{food}')
               else:
                   break
        def produces(q,name,food):
           for i in range(20):
               print(f'{name}生产了第 {i} 个{food}')
               time.sleep(1)
               q.put(food)

        if __name__ == '__main__':
           q = Queue()
           p = Process(target=produces, args=(q, '大壮', '馒头'))
           p1 = Process(target=produces, args=(q,'wusir','包子'))
           p2 = Process(target=consumer,args=(q,'taibai',))
           p3 = Process(target=consumer, args=(q,'alex'))
           p.start()
           p1.start()
           p2.start()
           p3.start()
           p.join()
           p1.join()
           q.put(None)
           q.put(None)
      •  

  • 相关阅读:
    GNU C的定义长度为0的数组
    Ubuntu如何启用双网卡
    DQN 文章第一篇
    awk用法
    Linux下C结构体初始化
    Linux kernel中的list怎么使用
    从美剧中学(1)
    Python @property 属性
    p40_数据交换方式
    3.TCP协议
  • 原文地址:https://www.cnblogs.com/iaoyuyuyuhuanghuang/p/14315469.html
Copyright © 2020-2023  润新知