生产者消费者模式例子实现

class Consumer(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self._queue = queue

def run(self):
while True:
msg = self._queue.get()

if isinstance(msg, str) and msg == 'quit':
break

time.sleep(1)
print 'consumer receive msg: %s' % msg

print 'consumer finished'


def Producer():
q = Queue.Queue()
c = Consumer(q)
c.start()

i = 0
while i < 10:
print 'producer put msg: %s' % i
q.put(str(i))
time.sleep(0.5)

i += 1

q.put('quit')
c.join()


if __name__ == '__main__':
Producer()

join的原理就是依次检验线程池中的线程是否结束,没有结束就阻塞直到线程结束,如果结束则跳转执行下一个线程的join函数。
2.一个生产者,多个消费者
 
# -*- coding:utf-8 -*-
from __future__ import unicode_literals
import threading
import time
import Queue


class Consumer(threading.Thread):
def __init__(selfqueue):
threading.Thread.__init__(self)
self._queue = queue

def run(self):
while True:
msg = self._queue.get()

if isinstance(msgstrand msg == 'quit':
break

time.sleep(1)
print 'consumer receive msg: %s' % msg

print 'consumer finished'


def build_consumer_pool(sizequeue):
consumers = []

for in range(size):
c = Consumer(queue=queue)
c.start()
consumers.append(c)

return consumers


def Producer():
q = Queue.Queue()
consumers = build_consumer_pool(3q)

i = 0
while i < 12:
print 'producer put msg: %s' % i
q.put(str(i))

i += 1

for in consumers:
q.put('quit')

for in consumers:
c.join()


if __name__ == '__main__':
Producer()

3.线程池:
 
# coding: utf-8

import time


from multiprocessing.dummy import Pool as ThreadPool


def consumer(msg):
print 'consumer receive msg: %s' % msg
time.sleep(1)
return msg


def producer():
items = []
pool = ThreadPool(4)

i = 0
while i < 12:
print 'producer put msg: %s' % i
items.append(str(i))
i += 1

results = pool.map(consumeritems)
pool.close()
pool.join()
print results


if __name__ == '__main__':
producer()

简单例子:
 
def producer():
ret = []
for in range(100):
ret.append("包子%d" % i)
return ret


def consumer(res):
for indexenty in enumerate(res):
print("%s个人吃%s" % (indexenty))

猜你喜欢

转载自blog.csdn.net/qq_28286027/article/details/81488550