• 进程间的通讯————IPC


    """
        IPC 指的是进程间通讯
            之所以开启子进程 肯定需要它帮我们完成任务 很多情况下 需要将数据返回给父进程
            然而 进程内存是物理隔离的
        解决方案:
        1.将共享数据放到文件中   就是慢
        2.管道   subprocess中的那个  管道只能单向通讯  必须存在父子关系
        3.共享一块内存区域  得操作系统帮你分配  速度快
    
    """
    
    from multiprocessing import  Process,Manager
    import time
    
    def task(dic):
        print("子进程xxxxx")
        # li[0] = 1
        # print(li[0])
        dic["name"] = "xx"
    
    if __name__ == '__main__':
        m = Manager()
        # li = m.list([100])
        dic = m.dict({})
        # 开启子进程
        p = Process(target=task,args=(dic,))
        p.start()
        time.sleep(3)
        print(dic)
    结果:
    子进程xxxxx
    {'name': 'xx'}
    """
        进程间通讯的另一种方式 使用queue
        queue  队列
        队列的特点:
            先进的先出
            后进后出
            就像扶梯
    """
    from multiprocessing import Process,Queue
    
    
    # 基础操作 必须要掌握的
    # 创建一个队列
    # q = Queue()
    # # 存入数据
    # q.put("hello")
    # q.put(["1","2","3"])
    # q.put(1)
    # # 取出数据
    # print(q.get())
    # print(q.get())
    # print(q.get())
    # print(q.get())
    
    # 阻塞操作 必须掌握
    # q = Queue(3)
    # # # 存入数据
    # q.put("hello",block=False)
    # q.put(["1","2","3"],block=False)
    # q.put(1,block=False)
    # # 当容量满的时候 再执行put 默认会阻塞直到执行力了get为止
    # # 如果修改block=False 直接报错 因为没地方放了
    # # q.put({},block=False)
    #
    # # # # 取出数据
    # print(q.get(block=False))
    # print(q.get(block=False))
    # print(q.get(block=False))
    # # 对于get   当队列中中没有数据时默认是阻塞的  直达执行了put
    # # 如果修改block=False 直接报错 因为没数据可取了
    # print(q.get(block=False))
    
    
    
    # 了解
    q = Queue(3)
    q.put("q",timeout=3)
    q.put("q2",timeout=3)
    q.put("q3",timeout=3)
    # 如果满了 愿意等3秒  如果3秒后还存不进去 就炸
    # q.put("q4",timeout=3)
    
    print(q.get(timeout=3))
    print(q.get(timeout=3))
    print(q.get(timeout=3))
    # 如果没了 愿意等3秒  如果3秒后还取不到数据 就炸     
    print(q.get(timeout=3))   #引发错误行
    结果:
    q
    q2
    q3
    Traceback (most recent call last):
      File "F:/oldboy课程记录/day36/代码/6.进程间通讯2.py", line 59, in <module>
        print(q.get(timeout=3))
      File "F:Pythonlibmultiprocessingqueues.py", line 105, in get
        raise Empty
    queue.Empty
  • 相关阅读:
    (QR14)带权的DAG节点排序
    数字组合
    最长连续不重复子序列
    树状数组
    归并排序
    差分
    前缀和
    64位整数乘法
    MySQL8 常用指令
    离线及实时实操架构
  • 原文地址:https://www.cnblogs.com/TF511/p/9932271.html
Copyright © 2020-2023  润新知