生产者消费者模式

进程之间的数据隔离
进程之间通信 Inter Process communication IPC
基于文件:同一台机器上的多个进程之间通信
基于socket的文件级别的通信来完成数据传递的
基于网络:同一台机器或多台机器上的多进程间通信
第三方工具(消息中间件) memcache、redis、rabbitmq、kafka

 from multiprocessing import Queue, Process


def pro(q):
    for i in range(5):
        print(q.get())


def son(q):
    for i in range(10):
        q.put('hello%s' % i)


if __name__ == '__main__':
    q = Queue()
    p = Process(target=son, args=(q,))
    p.start()
    p = Process(target=pro, args=(q,))
    p.start()

生产者消费者模型:一个放数据,一个取数据
爬虫的时候
分布式操作:celery
本质:就是让生产数据和消费数据的效率达到平衡且最大化效率

from multiprocessing import Queue, Process
import random
import time

def consumer(q):#消费者取到数据后才要进行某些操作
    for i in range(10):
        print(q.get())


def producer(q):#生产者:通常在放数据之前需要通过代码获取数据
    for i in range(10):
        time.sleep(random.random())
        q.put(i)
if __name__=='__main__':
    q=Queue()
    c1=Process(target=consumer,args=(q,))
    p1=Process(target=producer,args=(q,))
    c1.start()
    p1.start()

吃食物的例子说明更加完整的生产者-消费者模式

from multiprocessing import Queue, Process
import random
import time


def consumer(q, name):  # 消费者取到数据后才要进行某些操作
    # for i in range(20):  # 改函数内部的值,才能确定,不符合开放封闭原则,while True:
    #     print('%s 吃了 %s' % (name, q.get()))
    while True:
        food = q.get()
        if food:
            print('%s 吃了 %s' % (name, food))
        else:
            break


def producer(q, name, food):  # 生产者:通常在放数据之前需要通过代码获取数据
    for i in range(10):
        foodi = '%s%s' % (food, i)
        print('%s 生产了%s' % (name, foodi))
        time.sleep(random.random())
        q.put(foodi)


if __name__ == '__main__':
    q = Queue()
    c1 = Process(target=consumer, args=(q, 'alex'))

    p1 = Process(target=producer, args=(q, 'jane', 'cake'))
    p2 = Process(target=producer, args=(q, 'tom', 'banana'))
    c1.start()
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    q.put(None)

什么样的消费者是健康的消费者,外部控制停止
完善的消费者生产者模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值