python-day9 队列

和开源软件MQ 很相似

先进先出的逻辑,一个,N个噻, 1个,N个听Q

from multiprocessing import Process,Queue#队列,先进先出q=Queue(3)

q.put({‘a‘:1})q.put(‘b‘)q.put(‘c‘)print(q.full()) -->是否 噻满q.put(‘d‘,False) #等同于q.put_nowait(‘d‘)  塞满后 再 噻,不 等待,直接报错q.put(‘d‘,timeout=2)  #塞满后 再噻 等待2秒, 不能噻就报错print(q.qsize())    #查看q中 值的个数

print(q.get())print(q.get())print(q.get())print(q.empty()) -->是否取空print(q.get(block=False)) #等同于q.get_nowait(‘d‘)  听满后 再听,不 等待,直接报错print(q.get_nowait())print(q.get(timeout=2)) #听满后 再听 等待2秒, 不能听就报错

==========================模拟真实案例======================

吃包子, 厨师做,客户吃,相互 不干扰def GET(q,name,li):    print(‘客户‘, name)    for line in li:        time.sleep(1)        print(‘客户吃了‘,q.get())

def PUT(q,name,li):    print(‘厨师‘,name)    for line in li:        time.sleep(1)        print(‘%s生产出%s‘ %(name,line))        q.put(line)

if __name__ == ‘__main__‘:    q=Queue()    li = [‘包子%s‘ % i for i in range(10)]    p=Process(target=PUT,args=(q,‘la‘,li))    p.start()

p1=Process(target=GET,args=(q,‘onda‘,li))    p1.start()

但是问题是,客户吃完后 不释放进程,还在卡住

===============================通过 put 提交一个  固定的值,让 get去 判断======================

def GET(q,name):    while True:        time.sleep(2)        res=q.get()        if res is None :break        print(‘客户%s, 吃了%s‘ %(name,res))

def PUT(q,name,li):    for line in li:        time.sleep(1)        q.put(line)        print(‘厨师 %s 只做了%s‘ %(name,line))    q.put(None)

if __name__ == ‘__main__‘:    q=Queue()    p1=Process(target=GET,args=(q,‘la‘))    p1.start()    li=[‘包子%s‘ %i for i in range(10)]    p2=Process(target=PUT,args=(q,‘onda‘,li))    p2.start()    p1.join()    p2.join()    print(‘主进程‘)

==============================或者使用 JoinableQueue===========

from multiprocessing import Process,JoinableQueueimport timeimport random

def consumer(q,name):    while True:        # time.sleep(random.randint(1,3))        res=q.get()        q.task_done()        print(‘\033[41m消费者%s拿到了%s\033[0m‘ %(name,res))

def producer(seq,q,name):    for item in seq:        # time.sleep(random.randint(1,3))        q.put(item)        print(‘\033[42m生产者%s生产了%s\033[0m‘ %(name,item))    q.join()    print(‘============>>‘)

if __name__ == ‘__main__‘:    q=JoinableQueue()    c=Process(target=consumer,args=(q,‘egon‘),)    c.daemon=True #设置守护进程,主进程结束c就结束    c.start()

seq=[‘包子%s‘ %i for i in range(10)]    p=Process(target=producer,args=(seq,q,‘厨师1‘))    p.start()

# master--->producer----->q--->consumer(10次task_done)    p.join() #主进程等待p结束,p等待c把数据都取完,c一旦取完数据,p.join就是不再阻塞,进    # 而主进程结束,主进程结束会回收守护进程c,而且c此时也没有存在的必要了    print(‘主进程‘)

get()中

q.task_done() 每吃完一个,都会 汇报一下,直到吃完,

put()中

q.join(),等待 get()吃完,  put就可以 获取到,然后向下 进行,而此时 put() 还卡在 听q

get()

所以给 get()设置 守护进程,  在主进程释放后,将 get释放

主进程:

在让主进程通过  p.join()  等待 put()请求 结束 ,而put() 请求 会等get() 吃完, 最终 主进程才结束,然后 释放 get()

时间: 2025-01-08 15:06:05

python-day9 队列的相关文章

Python 用队列实现多线程并发

# Python queue队列,实现并发,在网站多线程推荐最后也一个例子,比这货简单,但是不够规范 # encoding: utf-8 __author__ = 'yeayee.com' # 由本站增加注释,可随意Fork.Copy from queue import Queue # Queue在3.x中改成了queue import random import threading import time class Producer(threading.Thread): ""&qu

python RabbitMQ队列使用(入门篇)

---恢复内容开始--- python RabbitMQ队列使用 关于python的queue介绍 关于python的队列,内置的有两种,一种是线程queue,另一种是进程queue,但是这两种queue都是只能在同一个进程下的线程间或者父进程与子进程之间进行队列通讯,并不能进行程序与程序之间的信息交换,这时候我们就需要一个中间件,来实现程序之间的通讯. RabbitMQ MQ并不是python内置的模块,而是一个需要你额外安装(ubunto可直接apt-get其余请自行百度.)的程序,安装完毕

python消息队列snakemq使用总结

Python 消息队列snakemq总结 最近学习消息总线zeromq,在网上搜了python实现的消息总线模块,意外发现有个消息队列snakemq,于是拿来研究一下,感觉还是很不错的,入手简单使用也简单(比ice强多了),就是资料太少了,只能自己抠. 一.关于snakemq的官方介绍 1纯python实现,跨平台 2自动重连接 3可靠发送--可配置的消息方式与消息超时方式 4持久化/临时 两种队列 5支持异步 -- poll() 6symmetrical -- 单个TCP连接可用于双工通讯 7

Python Celery队列

Celery队列简介: Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery. 使用场景: 1.你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情. 2.你想做一个定时任务,比如每天检测一下你们所有客户的资料,如

python RabbitMQ队列/redis

RabbitMQ队列 安装 http://www.rabbitmq.com/install-standalone-mac.html 安装python rabbitMQ module 1 2 3 4 5 6 7 pip install pika or easy_install pika or 源码   https://pypi.python.org/pypi/pika 实现最简单的队列通信 produce 1 import pika 2 connection = pika.BlockingConn

python多线程队列使用

#线程1 -> 队列 -> 线程2 -> url_web # # # #!/usr/bin/env python #! coding=utf-8 #!by=xiaohe import Queue,threading,time,random from moniItems import mon import urllib2 from flask import Flask,request,json queueLock = threading.Lock() class t1(threading.

python day9 学习整理

今天主要学习的内容是进程,线程,进程池,并发. 1.背景知识 进程的概念起源于操作系统,是操作系统最核心的概念. 进程是对正在运行程序的一个抽象,操作系统的其他所有内容都是围绕进程的概念展开的.所以想要真正了解进程,必须事先了解操作系统 具体可参考这个地址:http://www.cnblogs.com/linhaifeng/p/6295875.html 进程是操作系统提供的最古老也是最重要的抽象概念之一.即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力.将一个单

利用Python实现 队列的算法

以下内容都是来自"悟空"大神的讲解,听他的视频课,利用Python实现堆栈的算法,自己做了一些小总结,可能会存在自己理解的一些误区, 1.栈的实现 队列的特征是先进先出,同我们生活中的队列具有相同的特性:先排队的先办事.队列的应用场景非常多,例如消息通信.多进程间的协同.多线程间的协同等. 在算法前,我们需要先知道3个值  1.节点(节点作用是 进行一个指针(假设的)一个指向  2.就是现在这个位置上的元素的值)  2.还需要知道一个头,一个尾,就如上面两个一个head,就对应下面的代

Python 单向队列Queue模块详解

单向队列Queue,先进先出 '''A multi-producer, multi-consumer queue.''' try: import threading except ImportError: import dummy_threading as threading from collections import deque from heapq import heappush, heappop from time import monotonic as time __all__ =

python 消息队列-rabbitMQ 和 redis介绍使用

1.rabbitMQ 与ptyhon 进程queue 区别.进程queue 主要用户Python父子进程之间或者统一进程不同子进程.rabbit可以用户不同语言之前的相互交流,socket可以实现同样功能,但是较为复杂. 2. rabbitMQ  消息轮训.一个生产者对多个消费者时候.会自动将消息轮训给不同消费者. # Author : xiajinqi import pika connetction = pika.BlockingConnection(pika.ConnectionParame