python----多进程/生产者消费者模型

本文介绍了生产者消费者模式,这是一种用于解决多线程或多进程间数据交换的并发模式。生产者生成数据放入缓冲区,消费者从缓冲区取出并处理。通过JoinableQueue实现并发处理,同时展示了如何用Python处理数据竞争和死锁问题。生产者消费者模式常用于多线程数据处理、任务队列等场景。
摘要由CSDN通过智能技术生成

生产者消费者是一种常见的并发模式,用于解决多线程或多进程之间的数据交换和协作问题。

在生产者消费者模式中,有两种角色:生产者和消费者。生产者负责生成数据,并将数据放入一个共享的缓冲区中,而消费者则从缓冲区中取出数据并进行处理。
生产者和消费者之间通过共享的缓冲区进行通信。当缓冲区为空时,消费者将等待生产者生成数据并放入缓冲区中。当缓冲区已满时,生产者将等待消费者取出数据后再继续生产。
生产者消费者模式的优点包括:

  • 解耦:生产者和消费者之间通过缓冲区进行解耦,使得它们可以独立进行工作。
  • 并发:生产者和消费者可以并发地执行,从而提高系统的吞吐量和效率。
  • 缓冲:缓冲区可以平衡生产者和消费者之间的速度差异,避免资源的浪费和阻塞。
    然而,生产者消费者模式也有一些潜在的问题,如数据竞争和死锁。为了避免这些问题,可以使用同步机制(如互斥锁、条件变量)来保护共享资源的访问,并确保生产者和消费者之间的正确协作。
    在实际开发中,生产者消费者模式可以应用于各种场景,如多线程数据处理、任务队列、消息队列等。它是一种非常有用和灵活的并发模式,可以提高系统的可扩展性和性能。
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也没有存在的价值了,不需要继续阻塞在进程中影响主进程了。应该随着主进程的结束而结束,所以设置成守护进程就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值