笔记-python-standard library-17.7 queue

1.  queue

source code:Lib/queue.py

该模块实现了多生产者,多消费者队列。

此模块实现了所有的required locking semantics.

模块支持三种类型的队列,区别仅仅在于检索的顺序。

三种队列分别是FIFO,LIFO,优先级队列(使用heaq模块,优先抛出最小值)。

1.1.  模块中定义的类

class queue.Queue(maxsize=0)

class queue.LifoQueue(maxsize=0)

class queue.PriorityQueue(maxsize=0)

注意:优先级队列中优先抛出最小值。

exception queue.Empty

Exception raised when non-blocking get() (or get_nowait()) is called on a Queue object which is empty.

exception queue.Full

Exception raised when non-blocking put() (or put_nowait()) is called on a Queue object which is full.

1.2.  类方法

三种队列类都提供了以下方法:

1.   Queue.qsize()返回队列大致的大小,注意qsize()>0不代表get不会阻塞,同样,qsize()<maxsize不代表put不会阻塞

2.   Queue.empty()

3.   Queue.full()

4.   Queue.put(item, block=True, timeout=None)

block决定是否阻塞,timeout决定最长阻塞时间

5.   Queue.put_nowait(item)

6.   Queue.get_nowait(): equal to get(False)

下面两个方法来跟踪队列中的任务是否被执行完。

7.   Queue.task_done()

8.   Queue.join()

阻塞直到队列中的所有任务完成。

其它属性

maxsize:队列最大长度,可以在初始化时给出,也可创建后手动设定。

1.1.    productor and consumer

queue实现生产者与消费者

q = queue.Queue()

def productor(arg):
    while True:
        if q.qsize()
< 30:
            q.put(str(arg)+'banana')
        time.sleep(1)

def consumer(arg):
    while True:
        print('con {},
pro {}'
.format(arg, q.get()))
        time.sleep(2)

for i in range(3):
    t = threading.Thread(target=productor,
args=(i,))
    t.start()

for j in range(5):
    t = threading.Thread(target=consumer,
args=(j,))
    t.start()

1.2.    task_done and join

文档如下:

def task_done(self):

'''Indicate that a formerly enqueued task is complete.

Used by Queue consumer threads. 
For each get() used to fetch a task,

a subsequent call to task_done() tells the queue that the processing

on the task is complete.

If a join() is currently blocking, it will resume when all items

have been processed (meaning that a task_done() call was received

for every item that had been put() into the queue).

Raises a ValueError if called more times than there were items

placed in the queue.

'''

with self.all_tasks_done:

unfinished = self.unfinished_tasks - 1

if unfinished <= 0:

if unfinished < 0:

raise
ValueError('task_done() called too many times')

self.all_tasks_done.notify_all()

self.unfinished_tasks = unfinished

关键是如果不使用task_done,阻塞不会结束,

下面的代码把红色行删掉,线程会阻塞在q.join()处,

q = queue.Queue()
q.maxsize = 100

def productor(arg):
    while True:
        if q.qsize()
>50:
            q.join()
        else:
            q.put(str(arg)+' banana')
        time.sleep(0.5)

def consumer(arg):
    while True:
        print('con {},
pro {}'
.format(arg, q.get()))
        q.task_done()
        time.sleep(2)

def start_t():
    for i in range(4):
        t = threading.Thread(target=productor,
args=(i,))
        t.start()

for j in range(5):
        t = threading.Thread(target=consumer,
args=(j,))
        t.start()

time.sleep(1)
    while True:
        q_length = q.qsize()
        if q_length
== 0:
            pass
           
#break
       
else:
            print("queue's
size is {}"
.format(q_length))
            time.sleep(2)

start_t()
time.sleep(0.5)
print(r'end {}')
print(threading.enumerate())

2.     
小结:

  1. queue是线程安全的
  2. FIFO实际使用的是dqueue,
  3. 在使用join时一定要使用task_done

笔记-python-standard library-17.7 queue的更多相关文章

  1. Python Standard Library

    Python Standard Library "We'd like to pretend that 'Fredrik' is a role, but even hundreds of vo ...

  2. The Python Standard Library

    The Python Standard Library¶ While The Python Language Reference describes the exact syntax and sema ...

  3. Python语言中对于json数据的编解码——Usage of json a Python standard library

    一.概述 1.1 关于JSON数据格式 JSON (JavaScript Object Notation), specified by RFC 7159 (which obsoletes RFC 46 ...

  4. 《The Python Standard Library》——http模块阅读笔记1

    官方文档:https://docs.python.org/3.5/library/http.html 偷个懒,截图如下: 即,http客户端编程一般用urllib.request库(主要用于“在这复杂 ...

  5. 《The Python Standard Library》——http模块阅读笔记2

    http.server是用来构建HTTP服务器(web服务器)的模块,定义了许多相关的类. 创建及运行服务器的代码一般为: def run(server_class=HTTPServer, handl ...

  6. 《The Python Standard Library》——http模块阅读笔记3

    http.cookies — HTTP state management http.cookies模块定义了一系列类来抽象cookies这个概念,一个HTTP状态管理机制.该模块支持string-on ...

  7. Python Standard Library 学习(一) -- Built-in Functions 内建函数

    内建函数列表 Built-in Functions abs() divmod() input() open() staticmethod() all() enumerate() int() ord() ...

  8. python类库32[多进程通信Queue+Pipe+Value+Array]

    多进程通信 queue和pipe的区别: pipe用来在两个进程间通信.queue用来在多个进程间实现通信. 此两种方法为所有系统多进程通信的基本方法,几乎所有的语言都支持此两种方法. 1)Queue ...

  9. [译]The Python Tutorial#11. Brief Tour of the Standard Library — Part II

    [译]The Python Tutorial#Brief Tour of the Standard Library - Part II 第二部分介绍更多满足专业编程需求的高级模块,这些模块在小型脚本中 ...

  10. C++11新特性——The C++ standard library, 2nd Edition 笔记(一)

    前言 这是我阅读<The C++ standard library, 2nd Edition>所做读书笔记的第一篇.这个系列基本上会以一章一篇的节奏来写,少数以C++03为主的章节会和其它 ...

随机推荐

  1. Linux pptpd 的 iptables 包过滤设置

    用Centos架设了一台pptpd vpn服务器,信息如下: 服务器IP 192.168.100.1 /24 网关 192.168.100.254(NAT防火墙,将 <外网IP>:1723 ...

  2. oop编程思想

    oop的编程思想:抽象.封装.继承.多态. 1.抽象: 数据抽象:类描述的对象的属性或状态 行为抽象:类描述的对象的行为或功能 举例: 时钟:Class 数据:int Hour,Minute,Seco ...

  3. c++基础(积少成多)

    1.#include<string> #include<iostream> 这是引用头文件: 2.Using namespace std; 这是引用命名空间,防止同一个命名空间 ...

  4. UI自动化录制工具----UI Recorder

    1.系统和工具包 windows 7 64位 jdk,nodejs,webdriver,浏览器都放在工具包目录内.(晚上回去把文件上传到云盘,在分享给大家) 2.安装JDK和node.js 2.1 J ...

  5. TP5.1:连接数据库(全局配置、动态配置、DSN配置)

    前提: (1)在app\index\controller文件下新建一个名为Connect.php的控制器文件 (2)建立一个名为user_curd数据库,里面有一张user表,表内容为: 通过全局配置 ...

  6. do..while(false)的用法总结

    首先要注意: do..while(0) 代表do里面的东西至少被执行一次,在这里仅仅执行一次. 此种用法有三个用处: 代替{}代码块,实现局部作用域.在某些宏定义时非常有用: #define f(x) ...

  7. SpringMVC接受JSON参数详解

    转:https://blog.csdn.net/LostSh/article/details/68923874 SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session ...

  8. 递归遍历目录拷贝cdh下的lib到一个目录

    destpath='/home/hadoop/soft/hadoop-2.0.0-cdh4.5.0/cdhlib/'jarpath='/home/hadoop/soft/hadoop-2.0.0-cd ...

  9. 根据值设置select的选中项

    $('.selector').attr("checked", true); <s:iterator value="jobSelect" id=" ...

  10. 在c#中using和new这两个关键字有什么意义?

    在c#中using和new这两个关键字有什么意义?答:using 引入名称空间或者使用非托管资源, new 新建实例或者隐藏基类方法