生产者消费者是一种常见的并发模式,用于解决多线程或多进程之间的数据交换和协作问题。
在生产者消费者模式中,有两种角色:生产者和消费者。生产者负责生成数据,并将数据放入一个共享的缓冲区中,而消费者则从缓冲区中取出数据并进行处理。
生产者和消费者之间通过共享的缓冲区进行通信。当缓冲区为空时,消费者将等待生产者生成数据并放入缓冲区中。当缓冲区已满时,生产者将等待消费者取出数据后再继续生产。
生产者消费者模式的优点包括:
- 解耦:生产者和消费者之间通过缓冲区进行解耦,使得它们可以独立进行工作。
- 并发:生产者和消费者可以并发地执行,从而提高系统的吞吐量和效率。
- 缓冲:缓冲区可以平衡生产者和消费者之间的速度差异,避免资源的浪费和阻塞。
然而,生产者消费者模式也有一些潜在的问题,如数据竞争和死锁。为了避免这些问题,可以使用同步机制(如互斥锁、条件变量)来保护共享资源的访问,并确保生产者和消费者之间的正确协作。
在实际开发中,生产者消费者模式可以应用于各种场景,如多线程数据处理、任务队列、消息队列等。它是一种非常有用和灵活的并发模式,可以提高系统的可扩展性和性能。
from multiprocessing import Process,JoinableQueue
import time,random,os
def consumer(q):
while True:
res=q.get()
time.sleep(random.randint(1,3))
print('%s 吃 %s' %(os.getpid(),res))
q.task_done() #向q.join()发送一次信号,证明一个数据已经被取走了
def producer(name,q):
for i in range(10):
time.sleep(random.randint(1,3))
res='%s%s' %(name,i)
q.put(res)
print('生产了 %s' %(res))
q.join() #生产完毕,使用此方法进行阻塞,直到队列中所有项目均被处理。
if __name__ == '__main__':
q=JoinableQueue()
p1=Process(target=producer,args=('包子',q))
p2=Process(target=producer,args=('骨头',q))
p3=Process(target=producer,args=('泔水',q))
#消费者
c1=Process(target=consumer,args=(q,))
c2=Process(target=consumer,args=(q,))
# c1.daemon=True
# c2.daemon=True
#开始
p_l=[p1,p2,p3,c1,c2]
for p in p_l:
p.start()
print("the process of %s is being added"%(p))
p1.join()
p2.join()
p3.join()
print('主进程')
#主进程等--->p1,p2,p3等---->c1,c2
#p1,p2,p3结束了,证明c1,c2肯定全都收完了p1,p2,p3发到队列的数据
#因而c1,c2也没有存在的价值了,不需要继续阻塞在进程中影响主进程了。应该随着主进程的结束而结束,所以设置成守护进程就可以了。