pipe和queue.py

Posted 易竹3827

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()

以上是关于pipe和queue.py的主要内容,如果未能解决你的问题,请参考以下文章

unix pipe() 和dup2()的使用方法和原理

linux中的pipe和fifo的区别

流上的 .pipe 和管道有啥区别

socketpair和pipe的区别

在触发器中使用 DBMS_PIPE.PACK_MESSAGE 和 DBMS_PIPE.SEND_MESSAGE

[apue] 神奇的 Solaris pipe