zoukankan      html  css  js  c++  java
  • 进程间通信的两种实现方式(IPC)

    进程间通信的两种实现方式(IPC)

    IPC: iter processing communicate

    进程间通信:IPC(iter process communicate)
    linux free-m 可以查看共享内存
    借助于共享的物质来实现通信
    借助硬盘:效率太低
    通信应该借助内存:1 内存空间 2 处理好锁

    1 PIPE:管道
    2 Queue:队列 是PIPE + LOCK 实现 ——》占的内存空间
    from multiprocessing import Queue
    先进先出:先put进去的先get到
    只往队列里放数据量较小的消息(比如文件的地址),不应该放大数据
    q = Queue(3)
    q.put()
    q.get()
    1 Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递
    2 maxsize是队列中允许最大项数,省略则无大小限制。
    3.q.get方法可以从队列读取并且删除一个元素

    from multiprocessing import Queue
    
    
    q=Queue(3) #先进先出
    #注意:
    #1、队列占用的是内存空间
    #2、不应该往队列中放大数据,应该只存放数据量较小的消息
    # 掌握的
    q.put('first')
    q.put({'k':'sencond'})
    q.put(['third',])
    # print(q.get())
    
    q.put(4)  # q.put() 因为队列满了 放不进去,所以一直在等待着,程序不往下运行,卡住
    # 解决方法:注释掉 或者在上面get一次,释放掉里卖弄一个数据把4添加进去就可以。
    print(q.get())
    print(q.get())
    print(q.get())
    # print(q.get())
    put、 get 基本用法
    q=Queue(3) #先进先出
    q.put('first',block=True,timeout=3)
    q.put({'k':'sencond'},block=True,timeout=3)
    q.put(['third',],block=True,timeout=3)
    print('===>')
    q.put(4,block=True,timeout=3)
    
    
    print(q.get(block=True,timeout=3))
    print(q.get(block=True,timeout=3))
    print(q.get(block=True,timeout=3))
    print(q.get(block=True,timeout=3))
    get、put内部block和timeout属性

    如果向队列里面添加值,队列里值满的话,延迟后直接报full的异常。如果不指定延迟,程序会停住,一直等待。

    如果从队列里取值,队列里值空的话,延迟后会直接报empty的异常。如果不指定延迟,程序会停住,一直等待。

    队列满了再put值直接抛出异常,不阻塞

    队列空了再get值直接抛出异常,不阻塞

    q=Queue(3) #先进先出
    q.put('first',block=False,)
    q.put({'k':'sencond'},block=False,)
    q.put(['third',],block=False,)
    print('===>')
    # q.put(4,block=False,) # 队列满了直接抛出异常,不会阻塞
    
    print(q.get(block=False))
    print(q.get(block=False))
    print(q.get(block=False))
    print('get over')
    # print(q.get(block=False)) # 队列空了直接抛出异常,不会阻塞。
    block = False

    put_nowait 和get_nowait

    q=Queue(3) #先进先出
    
    q.put_nowait('first') #q.put('first',block=False,)
    q.put_nowait(2)
    q.put_nowait(3)
    # q.put_nowait(4)
    
    print(q.get_nowait())
    print(q.get_nowait())
    print(q.get_nowait())
    # print(q.get_nowait())
    put_nowait、get_nowait

    总结一下:默认情况下,block为True,队列满了会进入阻塞状态,一直等待,直到队列值由空位。队列空了也会一直等待,不会抛出异常。

    block为True,outtime设定为3s,那么阻塞时间只有3s,3s后会抛出异常。block为False时,不用指定时间,只要队列满了或者空了都会直接抛出异常。

    put_nowait 和get_nowait和block = False一样,没有阻塞,队列满了或者空了直接抛出异常。




  • 相关阅读:
    记一次擦窗机器人项目的拯救
    基于超声波的四轴定高控制简析
    秋夜
    还能再来过?
    机器人设计之一简单机械设计
    管理之殇
    C++11笔记<一>
    Android开发的菜鸟小记
    程序员客栈与DaoCloud这两家企业联手后,运维工程师要失业了!
    关爱码农成长:关于写代码二三事
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9300291.html
Copyright © 2011-2022 走看看