进程_队列

队列:进程间通信(IPC(inter-process communication),管道+锁

1. q.put方法用以插入数据到队列中,put方法还有两个可选参数:blocked和timeout。blocked为True(默认值)

  如果超时,会抛出Queue.Full异常。

  如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。

2. q.get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值)

   如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值

   否则, 如果队列为空,则立即抛出Queue.Empty异常.

3. q.get_nowait():同q.get(False)

4. q.put_nowait():同q.put(False)

5.q.task_done():使用者使用此方法发出信号,表示q.get()的返回项目已经被处理。

6. q.join():生产者调用此方法进行阻塞,直到队列中所有的项目均被处理。阻塞将持续到队列中的每个项目均调用q.task_done()方法为止

from multiprocessing import Queue
q=Queue(3)
q.put("first")
q.put("second")
q.put("third")

'''
q.put("fourth") #程序一直卡着,直到first取走
q.put("fourth",block=False) #队列满之后,抛出Full异常
q.put_nowait("fourth") #队列满之后,抛出Full异常
q.put("fourth",timeout=2)#队列满之后,2秒后抛出Full异常
'''


print(q.get())
print(q.get())
print(q.get())

'''
first
second
third

'''
#生产者消费者模型,JoinableQueue
'''
生产者在等

消费者-[q.task_done]->(队列)->[q.join]->生产者结束-[p.join]->主进程结束-[c.daemon]->消费者结束

q.task_done():消费者使用此方法发出信号,表示q.get()的返回项目已经被处理。
q.join():生产者调用此方法进行阻塞,直到队列中所有的项目均被处理。阻塞将持续到队列中的每个项目均调用q.task_done()方法为止

'''
from multiprocessing import Process,JoinableQueue
import time,os
def produce(q,food):
    for i in range(3):
        
        time.sleep(1)
        res="%s %s"%(food,i)
        q.put(res)        
        print("%s 生产了 %s" %(os.getpid(),res))
    q.join()#生产者等待队列
def consume(q):
    while True:
       res=q.get()
       if res is None:break
       time.sleep(2)
       print("%s 吃了 %s" %(os.getpid(),res))
       q.task_done()#向q.join()发送一次信号,证明一个数据已经被取走了
    
    
if __name__=="__main__":
    q=JoinableQueue()
    #生产者们
    p1=Process(target=produce,args=(q,"包子"))
    p2=Process(target=produce,args=(q,"饺子"))
    p3=Process(target=produce,args=(q,"花卷"))
    
    #消费者们
    c1=Process(target=consume,args=(q,))
    c2=Process(target=consume,args=(q,))
    c1.daemon=True
    c2.daemon=True
    
    p1.start()
    p2.start()
    p3.start()
    c1.start()
    c2.start()
    
    p1.join()
    p2.join()
    p3.join()
    
    print("主进程")
'''
14565 生产了 包子 0
14566 生产了 饺子 0
14568 生产了 花卷 0
14565 生产了 包子 1
14566 生产了 饺子 1
14568 生产了 花卷 1
14570 吃了 包子 0
14565 生产了 包子 2
14572 吃了 饺子 0
14566 生产了 饺子 2
14568 生产了 花卷 2
14570 吃了 花卷 0
14572 吃了 包子 1
14570 吃了 饺子 1
14572 吃了 花卷 1
14570 吃了 包子 2
14572 吃了 饺子 2
14570 吃了 花卷 2
主进程

'''

猜你喜欢

转载自www.cnblogs.com/hapyygril/p/12567369.html
今日推荐