Python 多进程编程之 进程间的通信(Queue)
1,进程间通信
Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法
----这是操作系统开辟的一个空间,可以让各个子进程把信息放到Queue中,也可以把自己需要的信息取走
----这就相当于系统给python开辟了一个聊天室,让python创建的子进程可以在这个聊天室里畅所欲言
----一个进程可以放多条消息到Queue中
2,实例
#导入Queue,Process from multiprocessing import Queue,Process import os #写入进程 def wp(q): print("%s开始写入:"%os.getpid) for i in "WANG": #将信息写入队列 q.put(i) print(i) #读取进程 def rd(q): print("%s开始读取"%os.getpid()) while True: if not q.empty(): #从队列读取信息 print("read to %s"%q.get()) if __name__=="__main__": #创建队列 q = Queue() #创建写入进程 w = Process(target=wp,args=(q,)) #启动写入进程 w.start() #创建读取进程 r = Process(target=rd,args=(q,)) #启动读取进程 r.start()
3,执行结果
1265开始读取 <built-in function getpid>开始写入: W A N G read to W read to A read to N read to G
4,进程间通信常用函数
q.Queue() -------------------------------------------------------- def __init__(self, maxsize=-1): self._maxsize = maxsize ---- maxsize=-1,表示队列个数无穷大 ---- 初始化Queue对象时,(例,q=Queue() ) 或括号中没有指定最大可接收的消息数量,或数量为负值, 那么就表示可接收的消息数量没有上限
q.put("信息") --------------------------------- 将信息放入队列中 def put(self, obj, block=True, timeout=None): pass obj----传入的信息 block=True----阻塞=真 : 真阻塞(默认值) timeout=None----等待时间,None(默认值)表示无限等待, 如果timeou设置值,则会等待N秒后,强制放入(put)
q.get() ---------------------------------- def get(self, block=True, timeout=None): pass 从队列中拿出一个进程消息
block=True 默认值是真阻塞,
timeout=None 意思是 无限,无穷
两个合在一起的意思是 无限阻塞,无穷等待
队列的特点是:先进先出 所以get拿的顺序也是,先进先出 first in first out
q.put_nowait() ------------------------------------- def put_nowait(self, obj): pass 相当于q.put(obj,False) 不等待,直接放入
q.get_nowait() ---------------------------------------- def get_nowait(self): pass 不做等待,就是要获取 如果队列中没有消息,就会报错 ----解决报错,加入try 异常处理
q.qsize() ------------------------------------ def qsize(self): return 0 返回当前队列包含的消息数量
q.full() ------------------------------ 检测队列是否已经满了 True: 满 False: 未满
q.empty() --------------------------------- def empty(self): return False 检测队列是否为空 True:空 False:未空