ython实现进程间的通信有Queue,Pipe,Value+Array等,其中Queue实现多个进程间的通信,而Pipe实现两个进程间通信,而Value+Array使用得是共享内存映射文件的方式,所以速度比较快

1.Queue的使用

from multiprocessing import Queue,Process
import os,time,random

#添加数据函数
def proc_write(queue,urls):
    print("进程(%s)正在写入..."%(os.getpid()))
    for url in urls:
        queue.put(url)
        print("%s被写入到队列中"%(url))
        time.sleep(random.random()*3)

#读取数据函数
def proc_read(queue):
    print("进程(%s)正在读取..."%(os.getpid()))

    while True:
        url = queue.get();
        print("从队列中提取到:%s"%(url))

if __name__ =="__main__":
    queue = Queue()
    proc_writer1 = Process(target=proc_write,args=(queue,["ur1","ur2","ur3","ur4"]))
    proc_writer2 = Process(target=proc_write,args=(queue,["ur5","ur6","ur7","ur8"]))
    proc_reader = Process(target=proc_read,args=(queue,))
    proc_writer1.start()
    proc_writer2.start()
    proc_reader.start()
    proc_writer1.join()
    proc_writer2.join()
    proc_reader.terminate()

2.Pipe的使用

pipe用于两个进程间的通信,两个进程分别位于管道的两端,Pipe方法返回(conn1,conn2)代表一个管道的两端,Pipe方法有dumplex参数,若该参数为True,管道为全双工模式,若为Fasle,conn1只负责接收消息,conn2只负责发送消息.send和recv方法分别是发送和接收消息的方法,例如,在全双工模式下,可以调用conn1.send发送消息,conn1.recv接收消息,如果没有消息可以接收,recv方法会一直阻塞,如果管道已经被关闭,recv方法会抛出EOFError

from multiprocessing import Pipe,Process
import random,time,os

def proc_send(pipe,urls):
    for url in urls:
        print("进程(%s)发送:%s"%(os.getpid(),url))
        pipe.send(url)
        time.sleep(random.random())

def proc_recv(pipe):
    while True:
        print("进程(%s)接收到:%s"%(os.getpid(),pipe.recv()))
        time.sleep(random.random())

if __name__ == "__main__":
    pipe = Pipe()
    p1 = Process(target=proc_send,args=(pipe[0],["url_"+str(i) for i in range(10)],))
    p2 = Process(target=proc_recv,args=(pipe[1],))
    p1.start()
    p2.start()
    p1.join()
    p2.terminate()

猜你喜欢

转载自www.cnblogs.com/gaosai/p/9825051.html