生产者消费者模型----------基于多进程、多线程、单线程并发

本文通过三种不同方式(基于进程、线程及协程)实现了生产者消费者模型,并使用Python的multiprocessing、threading和gevent模块进行了演示。具体包括:创建生产者和消费者角色,利用队列进行数据传递等。
生产者消费者模型
from multiprocessing import Process,Queue
import time,random
def producer(name,q):
    for i in range(1,11):
        ret = "泔水%s"%i
        q.put(ret)
        print("厨师%s生产了%s" % (name, ret))
        time.sleep(random.randint(0,2))
def customer(name,q):
    while True:
        ret = q.get()
        if ret ==None:break
        time.sleep(random.randint(1,2))
        print("顾客%s吃了%s"%(name,ret))
if __name__ == '__main__':
    q =Queue()
    p = Process(target=producer,args=("egon",q))
    c = Process(target=customer,args=("alex",q))
    p.start()
    c.start()
    p.join()
    q.put(None)
    c.join()
    print("主进程")
基于进程
from threading import Thread,current_thread
import queue
import time,random
def producer(name,q):
    for i in range(1,11):
        ret = "泔水%s"%i
        q.put(ret)
        print("厨师%s生产了%s" % (name, ret),current_thread().getName())
        time.sleep(random.randint(0,2))
def customer(name,q):
    while True:
        ret = q.get()
        if ret ==None:break
        time.sleep(random.randint(1,2))
        print("顾客%s吃了%s"%(name,ret),current_thread().getName())
if __name__ == '__main__':
    q =queue.Queue()
    p = Thread(target=producer,args=("egon",q))
    c = Thread(target=customer,args=("alex",q))
    p.start()
    c.start()
    p.join()
    q.put(None)
    c.join()
    print("主线程")
基于线程
from gevent import monkey;monkey.patch_all()
import gevent
import queue
import threading
import time,random
def producer(name,q):
    for i in range(1,11):
        ret = "泔水%s"%i
        q.put(ret)
        print("厨师%s生产了%s" % (name, ret),threading.current_thread().getName())
        time.sleep(random.randint(0,2))
def customer(name,q):
    while True:
        ret = q.get()
        if ret ==None:break
        time.sleep(random.randint(1,2))
        print("顾客%s吃了%s"%(name,ret),threading.current_thread().getName())
if __name__ == '__main__':
    q =queue.Queue()
    g1 = gevent.spawn(producer,"egon",q)
    g2 = gevent.spawn(customer,"alex",q)

    g1.join()
    q.put(None)
    g2.join()
    print("主线程",threading.current_thread().getName())
单线程下实现并发

 

转载于:https://www.cnblogs.com/houangpy-7/p/7701202.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值