• pipe和queue.py


    """
    multiprocessing提供了threading包中没有的IPC(进程间通信),效率上更高。应优先考虑Pipe和Queue,避免使用Lock/Event/Semaphore/Condition等同步方式(因为它们占据的不是用户进程的资源)。
    multiprocessing包中有Pipe类和Queue类来分别支持这两种IPC机制。Pipe和Queue可以用来传送常见的对象。
    ①Pip可以是单向(half-duplex),也可以是双向(duplex)。我们通过mutiprocessing.Pipe
    (duplex=False)创建单向管道(默认为双向)。一个进程从pipe一端输入对象,然后被 pipe另一端的进程接收。单向管道只允许管道一端的进程输入,而双向管道则允许从两端输入。
    """
    import multiprocessing
    def proc1(pipe):
    pipe.send("hello")
    print("proc1 rec:",pipe.recv())

    def proc2(pipe):
    print("proc2 rec:",pipe.recv())
    pipe.send("hello,too")

    if __name__ == '__main__':
    multiprocessing.freeze_support()
    pipe = multiprocessing.Pipe()
    p1 = multiprocessing.Process(target=proc1,args=(pipe[0],))
    p2 = multiprocessing.Process(target=proc2,args=(pipe[1],))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

    """
    这里的pipe是双向的。pipe对象建立的时候,返回一个含有两个元素的表,每个元素代表pipe的一端(Connection对象)。我们对pipe的某一端调用send0方法来传送对象,在另一端使用recv)来接收。
    ②Queue类与Pipe相类似,都是先进先出结构。但Queue类允许多个进程放入,多个进程从队列取出对象。Queue类使用Queue(maxsize)创建,maxsize表示队列中可以存放对象的最大数量。
    """

    import multiprocessing
    import os,time
    def inputQ(queue):
    info = str(os.getpid()) + '(put):' + str(time.time())
    queue.put(info)

    def outputQ(queue,lock):
    info = queue.get()
    lock.acquire()
    print((str(os.getpid()) + '(get):' + info))
    lock.release()

    if __name__ == '__main__':
    record1 = []
    record2 = []
    lock = multiprocessing.Lock() # 加锁为防止散乱的打印
    queue = multiprocessing.Queue(3)
    for i in range(10):
    process = multiprocessing.Process(target=inputQ,args=(queue,))
    process.start()
    record1.append(process)
    for i in range(10):
    process = multiprocessing.Process(target=outputQ,args=(queue,lock))
    process.start()
    record2.append(process)
    for p in record1:
    p.join()

    queue.close() #没有更多的时间表、关闭queue
    for p in record2:
    p.join()
  • 相关阅读:
    lnmp vhost 虚拟目录配置
    vi 编辑器常用命令(转)
    centos7 nginx 加入开机启动
    centos7 编译安装mysql
    IE8以下支持css3 border-radius渲染方法
    html5 web 摇一摇切换歌曲
    L0、L1与L2范数
    c++多线程编程:常见面试题
    核函数以及SVM相关知识(重点)
    梯度下降法的三种形式BGD、SGD以及MBGD
  • 原文地址:https://www.cnblogs.com/zhang-da/p/12210537.html
Copyright © 2020-2023  润新知