Python之路PythonThread,第三篇,进程3

python3 进程3

 管道

在内存中开辟一个管道空间,对多个进程可见。 在通信形式上形成一种约束;

linux 文件类型

b    c      d         -                l               s                      p

            目录   普通文件  链接        套接字           管道

multiprocessing    -----> Pipe函数

Pipe(duplex)

功能:创建一个管道

参数:duplex 默认为True 表示管道为双向管道(全双工);

           如果设置为False, 则表示管道为单向管道;

返回值:返回两个管道流对象,分配表示管道的两端;

             如果参数为True(默认),两个对象均可发送接收;

             如果为False时,则第一个对象只能接收,第二个对象只能发送;

说明:1, 向管道发送数据使用send()函数,从管道接收数据使用recv() 函数;

            2,recv() 函数为阻塞函数,当管道中数据为空时会阻塞;

             3,一次recv() ,只能接收一次send()的内容;

              4,send() 可以发送字符串数字列表等多种类型数据;

 1 from multiprocessing import Process,Pipe 
 2 import os,time
 3 
 4 #创建管道对象
 5 #当参数为False的时候child只能recv parent只能send
 6 # child_conn,parent_conn = Pipe(False)
 7 
 8 child_conn,parent_conn = Pipe()
 9 
10 #子进程函数
11 def fun(name):
12     time.sleep(1)
13     #发送一个字符串到管道
14     child_conn.send('hello' + str(name))
15     print(os.getppid(),"----",os.getpid())
16 
17 jobs = []
18 #创建5个子进程
19 for i in range(5):
20     p = Process(target = fun,args = (i,))
21     jobs.append(p)
22     p.start()
23 
24 for i in range(5):
25     data = parent_conn.recv()
26     print(data)
27 
28 for i in jobs:
29     i.join()
View Code

消息队列:

multiprocessing ---> Queue

在内存中开辟一个队列模型,用来存放消息,任何拥有队列队形的进程都可以进行消息的存放和取出;

Queue(maxsize = 0)

功能:创建一个消息队列对象;

参数:maxsize 默认为0 表示消息队列可以存放的消息由系统自动分配的空间而定;

                            > 0 的正整数   表示队列中最多存放多少条消息;

返回值:消息队列对象;

q.put() 

1,向消息队列中存放一条消息,当消息队列满的时候,会阻塞;

2, 存放的消息类型可以是数字,列表,字符串等;

q.full()

判断队列是否为满, 如果满则返回True,否则返回False;

q.qsize()

查看当前队列中消息数量;

q.get()

获取消息,每次获取一条; 当消息队列为空时,则为阻塞;

说明: put() 、get() 中block参数和timeout参数

block默认为True,表示两个函数都是阻塞函数;

         如果设置为False, 则表示不阻塞;

timeout  当block设置为True时,表示超时等待时间;

 1 from multiprocessing import Queue 
 2 
 3 #创建消息队列对象
 4 q = Queue(3)
 5 
 6 i = 0
 7 # 存放消息 
 8 while True:
 9     #判断队列是否满了
10     if q.full():
11         print("queue is full")
12         break
13     q.put("hello" + str(i))
14     i += 1
15 
16 print("当前队列有%d条消息"%q.qsize())
17 
18 for i in range(q.qsize()):
19     print("获取消息%s"%q.get())
20 
21 print("is empty?",q.empty())
22 
23 print(q.get(True,3))
24 
25 print("process over")
View Code

           

猜你喜欢

转载自www.cnblogs.com/weizitianming/p/9190317.html