标签:record map 加锁 imp cti ssi proc lock inpu
"""
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()
标签:record map 加锁 imp cti ssi proc lock inpu
原文地址:https://www.cnblogs.com/zhang-da/p/12210537.html