生产者消费者模型(一)
import threading, time, queue
q = queue.Queue()
def Produce(name):
count = 0 # conut表示做的包子总个数
while count < 10:
print('厨师%s在做包子中...' % name)
time.sleep(2)
q.put(count) # 容器中添加包子
# 当做完一个包子后就要给顾客发送一个信号,表示已经做完,让他们吃包子
print('produce%s已经做好了第%s个包子' % (name, count))
count += 1
print('oking...')
def Consumer(name):
count = 0 # count表示包子被吃的总个数
while count < 10:
time.sleep(2) # 排队去取包子,
if not q.empty(): # 如果存在
data = q.get() # 取包子, 吃包子
print('\033[32;1mConsumer %s已经把第%s个包子吃了...\033[0m' % (name, data))
else:
print('包子被吃完了...')
count += 1
if __name__ == '__main__':
p1 = threading.Thread(target=Produce, args=('A君',))
c1 = threading.Thread(target=Consumer, args=('B君',))
c2 = threading.Thread(target=Consumer, args=('C君',))
c3 = threading.Thread(target=Consumer, args=('D君',))
p1.start()
time.sleep(10)
c1.start()
c2.start()
c3.start()
生产者消费者模型(二)
这个是A做一个,就等着,吃完的人发出一个信号task_down,A在继续进行做
import threading, time, queue
q = queue.Queue()
def Produce(name):
count = 0 # conut表示做的包子总个数
while count < 10:
print('厨师%s在做包子中...' % name)
time.sleep(2)
q.put(count) # 容器中添加包子
print('produce%s已经做好了第%s个包子' % (name, count))
count += 1
# q.task_done() # 当做完一个包子后就要给顾客发送一个信号,表示已经做完,让他们吃包子
q.join() # 等待接收信号,
print('ok...')
def Consumer(name):
count = 0 # count表示包子被吃的总个数
while count < 10:
time.sleep(2)
# print('waiting...')
# q.join()
data = q.get() # 取包子, 吃包子
print('%seating...' % name)
time.sleep(4) # 吃包子用了4s然后给厨师发送一个信号
q.task_done()
print('\033[32;1mConsumer %s已经把第%s个包子吃了...\033[0m' % (name, data))
# print('包子被吃完了...')
count += 1
if __name__ == '__main__':
p1 = threading.Thread(target=Produce, args=('A君',))
c1 = threading.Thread(target=Consumer, args=('B君',))
c2 = threading.Thread(target=Consumer, args=('C君',))
c3 = threading.Thread(target=Consumer, args=('D君',))
p1.start()
time.sleep(10)
c1.start()
c2.start()
c3.start()
生产者消费者模型(三)
import threading, time, queue
q = queue.Queue()
# 利用同步对象也可以
event = threading.Event()
def Produce(name):
count = 0 # conut表示做的包子总个数
while count < 10:
print('厨师%s在做包子中...' % name)
time.sleep(2)
q.put(count) # 容器中添加包子
print('produce%s已经做好了第%s个包子' % (name, count))
event.set() # 等待接收信号,
count += 1
def Consumer(name):
count = 0
while count < 10:
# time.sleep(2)
event.wait()
data = q.get() # 取包子, 吃包子
print('%seating...' % name)
time.sleep(2) # 吃包子用了2s然后给厨师发送一个信号
print('\033[32;1mConsumer %s已经把第%s个包子吃了...\033[0m' % (name, data))
event.clear()
count += 1
if __name__ == '__main__':
p1 = threading.Thread(target=Produce, args=('A君',))
c1 = threading.Thread(target=Consumer, args=('B君',))
c2 = threading.Thread(target=Consumer, args=('C君',))
c3 = threading.Thread(target=Consumer, args=('D君',))
p1.start()
time.sleep(10)
c1.start()
c2.start()
c3.start()