#进程间通信--Queue--操作系统开启消息队列
'''Process有时是需要通信的,操作系统提供了很多机制来实现进程间通信
而Queue就是其中一个
1、Queue的使用问题,可以使用multiprocessing模块下的Queue实现多进程直接的传递,Queue本身就是
一个消息队列,首先
'''


#但是MAC的qsize  用不了。。,所以本篇代码会报错NotImplementedError,属于正常


from multiprocessing import Queue


if __name__=='__main__':
    #初始化一个Queue对象,最多可以接收3条信息
    # Queue类的__init__方法中def __init__(self, maxsize=-1):#-1表示无穷大
    #实战代码就是-1或者不写,就是无穷大
    # q=Queue(3)#开辟了空间
    #
    # #向里面放消息,一个进程可以放多条消息到Queue中
    # #放消息
    # q.put('消息1')
    # q.put('消息2')
    # print(q.full())
    # q.put('消息3')
    # print(q.full())
   # q.full()#满为真True,未满:False
   #  if q.full():
   #      print('消息队列已经满了,不要再放了')
   #  else:
   #      q.put('消息N')

    #若队列满了,我还接着put,会发生什么
    #q.put('消息4')#等同于q.put('消息4',True,None)
    #def put(self, obj, block=True, timeout=None):
    #会发生阻塞,等待,直到消息队列不满时添加进去
    #print(q.full())
    # q.put('消息4',False)#因为之前已经放满了,所以执行本语句会报错queue.Full

    #下面的try...except不够健壮,会阻塞一直等待下去
    # try:
    #     q.put('消息4')
    # except:
    #     print('消息队列已经满了,现在消息数量:%d'%q.qsize())

    #实战中以下会更健壮
    # if not q.full():
    #     q.put('消息内容',False)#False意为不等,立即向里面放
    #以上两句等同于Queue中put_nowait方法
    # if not q.full():
    #     q.put_nowait('消息内容')

    #获取信息 先进先出原则FIFO
    q1=Queue(3)
    q1.put('A')
    q1.put('B')
    q1.put('c')
    count=q1.qsize()#线程池数量为全局变量
    if not q1.empty():
        for i in range(count):
        # get(self, block=True, timeout=None): get(self, block=True, timeout=None):
        #print(q1.get())#取出线程池所有消息后,会一直等待,不能结束,发生阻塞
            print('%d'%q1.qsize())
            print(q1.get_nowait())

    print('over!')
'''
说明:
1、初始化Queue对象时,例如:q=Queue(),或括号中没有指定最大可接收的消息数量,
或数量为负值,那么就表示可接收的消息数量没有上限(直到内存的尽头)

2、常用函数
a.   q.qsize()返回当前队列包含的消息数量
b.   q.full()表示当前队列是否已经满了,True-满,False-未满
c.   q.put('消息',block=True,timeout=None)
     q.get(block=True,timeout=None)
block(默认True)----此时阻塞,等待,直到put/get进去为止
timeout(默认None)--一直等待,如果设置timeout,等待N秒后会强制put/get
d.  q.put_nowait()--相当于q.put('消息内容',False)
e.  q.empty()表示当前队列是否为空,True空,False不空
f.  q.get_nowait()--相当于q.get(block=False)
'''
A
B
C
over