葫芦金刚

导航

Python 多进程编程之 进程间的通信(Queue)

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:未空

 

posted on 2018-02-08 20:33  葫芦金刚  阅读(5014)  评论(0编辑  收藏  举报