python队列

本文介绍了在Python中使用`multiprocessing`模块实现生产者消费者模型,包括使用`Queue`、`JoinableQueue`和管道`Pipe`进行数据传递,并提到了如何通过`join()`和`task_done()`确保数据完整同步以及避免数据竞争问题。
摘要由CSDN通过智能技术生成
from multiprocessing   import Queue
q = Queue()  # 实例化队列
q.put() # 往队列里放数据
q.get() # 从队列里取数据
print(q.full())#判断队列是否满了
print(q.empty())#判断队列是否为空

生产者消费者模型

from multiprocessing import Process, Queue
import time

def producer(p, name, food):
    for i in range(10):
        time.sleep(1)
        f = '%s生产了第%s个%s' % (name, i, food)
        p.put(f)
        print(f)
def constom(q, name):
    while True:
        time.sleep(2)
        food = q.get()
        if food == None:
            break
        print('%s吃了一个%s' % (name, food))

if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=producer, args=(q, 'egon', '包子'))
    p2 = Process(target=producer, args=(q, 'xiaohong', '泔水'))
    c1 = Process(target=constom, args=(q, 'jin'))
    c2 = Process(target=constom, args=(q, 'alex'))
    p1.start()
    p2.start()
    c1.start()
    c2.start()
    p1.join()
    p2.join()
    q.put(None)
    q.put(None)

使用Joinable实现生产者消费者模型

from multiprocessing   import Process,JoinableQueue
import time
import random
def producer(p,name,food):
    for i in range (10):
        time.sleep(1)
        f = '%s生产了第%s个%s'%(name,i,food)
        p.put(f)
        print(f)
    p.join()  #阻塞状态,感知一个队列中的数据全部被处理完,才能结束
def constom(q,name):
    while True :
        time.sleep(2)
        food = q.get()
        print('%s吃了一个%s'%(name,food))
        q.task_done()
if __name__=='__main__':
    q = JoinableQueue()
    p1 = Process(target=producer,args=(q,'egon','包子'))
    p2 = Process(target=producer,args=(q,'xiaohong','泔水'))
    c1 = Process(target=constom,args=(q,'jin'))
    c2 = Process(target=constom,args=(q,'alex'))
    p1.start()
    p2.start()
    c1.daemon=True
    c2.daemon=True
    c1.start()
    c2.start()
    p1.join()
    p2.join()

通过管道实现生产者消费者模型

from multiprocessing   import Process,Pipe
import time
import random
def producer(pro,conn,name,food):
    conn.close()
    for i in range (10):
        time.sleep(1)
        f = '%s生产了第%s个%s'%(name,i,food)
        print(f)
        pro.send(f)
    pro.close()
def constom(pro,conn,name):
    pro.close()
    while True :
        try:
            time.sleep(2)
            food = conn.recv()
            print('%s吃了一个%s'%(name,food))
        except EOFError:
            conn.close()
            break
if __name__=='__main__':
    pro,conn = Pipe()
    p1 = Process(target=producer,args=(pro,conn,'egon','包子'))
    c1 = Process(target=constom,args=(pro,conn,'jin'))
    p1.start()
    c1.start()
    pro.close()
    conn.close()

可能出现同一个进程拿到同一个数据,需要加锁来控制管道的行为,来避免进程之间争夺数据造成的数据不安全现象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值