zoukankan      html  css  js  c++  java
  • 进程之间的通讯

    IPC 指的是进程间的通讯

      之所以开启至今城 肯定是需要它帮我们完成任务  很多情况下  需要将数据返回给主进程,然而进程内存是物理隔离的

      解决方案:

        1.将共享数据放到文件中     就是慢

        2.管道 subprocess 中的那个    管道只能单向通信  必须存在父子关系

        3. 共享一块内存区域  得操作系统帮你分配  速度快

    怎么来搞出一块共享的内存区域?

    导入from  multiprocessing import Manager

         

    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)

    """
    进程间通讯的另一种方式 使用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))

    但是如果有多个子进程同时对共享文件的里面的数据进行修改的时候,各个子进程会发生资源竞争,导致发生冲突

    这时候我们就需要导入queue这个模块来进行处理这个问题:

    queue 这个模块和队列一样

      先进先出

    # 了解
    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))

  • 相关阅读:
    批量修改文件的编码格式至UTF-8
    springboot搭建
    Redit集群搭建-Sentinel模式搭建
    Java并发编程:深入剖析ThreadLocal
    Hibernate常见问题 No row with the given identifier exists问题的解决办法及解决
    vector删除元素与清除内存空洞
    BZOJ 1003 [ZJOI2006]物流运输trans SPFA+DP
    Mybatis+Oracle批处理
    【日常学习】【线性DP】codevs1044 拦截导弹题解
    hdu5353 Average
  • 原文地址:https://www.cnblogs.com/frank007/p/9931427.html
Copyright © 2011-2022 走看看