Python——进程队列

队列 先进先出

 1 from multiprocessing import Queue
 2 q = Queue(5) #队列的大小
 3 q.put(1) #放入内容
 4 q.put(2) #放入内容
 5 q.put(3) #放入内容
 6 q.put(4) #放入内容
 7 q.put(5) #放入内容
 8 print(q.full()) #你的队列是否满了
 9 print(q.get()) #取出队列中目前排在最前面的数
10 q.empty() #判断队列是否为空
定义
 1 from multiprocessing import Queue,Process
 2 def produce(q):
 3     q.put('hello')
 4 
 5 def consume(q):
 6     print(q.get())
 7 
 8 if __name__ == '__main__':
 9     q = Queue()
10     p = Process(target=produce,args=(q,))
11     p.start()
12     c = Process(target=consume, args=(q,))
13     c.start()
队里进程通信

生产者消费者模型,解决供需不平和的问题

 1 # 队列
 2 # 生产者消费者模型
 3 
 4 # 生产者 进程
 5 # 消费者 进程
 6 import time
 7 import random
 8 from multiprocessing import Process,Queue
 9 def consumer(q,name):
10     while True:
11         food = q.get()
12         if food is None:
13             print('%s获取到了一个空'%name)
14             break
15         print('\033[31m%s消费了%s\033[0m' % (name,food))
16         time.sleep(random.randint(1,3))
17 
18 def producer(name,food,q):
19     for i in range(4):
20         time.sleep(random.randint(1,3))
21         f = '%s生产了%s%s'%(name,food,i)
22         print(f)
23         q.put(f)
24 
25 if __name__  == '__main__':
26     q = Queue(20)
27     p1 = Process(target=producer,args=('Egon','包子',q))
28     p2 = Process(target=producer, args=('wusir','泔水', q))
29     c1 = Process(target=consumer, args=(q,'alex'))
30     c2 = Process(target=consumer, args=(q,'jinboss'))
31     p1.start()
32     p2.start()
33     c1.start()
34     c2.start()
35     p1.join()
36     p2.join()
37     q.put(None)
38     q.put(None)
实例

使用joinableQueue解决生产消费者问题

 1 import time
 2 import random
 3 from multiprocessing import Process,JoinableQueue
 4 def consumer(q,name):
 5     while True:
 6         food = q.get()
 7         print('\033[31m%s消费了%s\033[0m' % (name,food))
 8         time.sleep(random.randint(1,3))
 9         q.task_done()     # count - 1
10 
11 def producer(name,food,q):
12     for i in range(4):
13         time.sleep(random.randint(1,3))
14         f = '%s生产了%s%s'%(name,food,i)
15         print(f)
16         q.put(f)
17     q.join()    # 阻塞  直到一个队列中的所有数据 全部被处理完毕
18 
19 if __name__  == '__main__':
20     q = JoinableQueue(20)
21     p1 = Process(target=producer,args=('Egon','包子',q))
22     p2 = Process(target=producer, args=('wusir','泔水', q))
23     c1 = Process(target=consumer, args=(q,'alex'))
24     c2 = Process(target=consumer, args=(q,'jinboss'))
25     p1.start()
26     p2.start()
27     c1.daemon = True   # 设置为守护进程 主进程中的代码执行完毕之后,子进程自动结束
28     c2.daemon = True
29     c1.start()
30     c2.start()
31     p1.join()
32     p2.join()      # 感知一个进程的结束
33 
34 #  在消费者这一端:
35     # 每次获取一个数据
36     # 处理一个数据
37     # 发送一个记号 : 标志一个数据被处理成功
38 
39 # 在生产者这一端:
40     # 每一次生产一个数据,
41     # 且每一次生产的数据都放在队列中
42     # 在队列中刻上一个记号
43     # 当生产者全部生产完毕之后,
44     # join信号 : 已经停止生产数据了
45                 # 且要等待之前被刻上的记号都被消费完
46                 # 当数据都被处理完时,join阻塞结束
47 
48 # consumer 中把所有的任务消耗完
49 # producer 端 的 join感知到,停止阻塞
50 # 所有的producer进程结束
51 # 主进程中的p.join结束
52 # 主进程中代码结束
53 # 守护进程(消费者的进程)结束
View Code

 

posted @ 2018-10-22 13:45  澄心元素  阅读(1606)  评论(0编辑  收藏  举报