python 中的queue, deque
创建双向队列
import collections
d = collections.deque()
append(往右边添加一个元素)

import collections
d = collections.deque()
d.append(1)
d.append(2)
print(d) #输出:deque([1, 2])

appendleft(往左边添加一个元素)

import collections
d = collections.deque()
d.append(1)
d.appendleft(2)
print(d) #输出:deque([2, 1])

clear(清空队列)

import collections
d = collections.deque()
d.append(1)
d.clear()
print(d) #输出:deque([])

copy(浅拷贝)

import collections
d = collections.deque()
d.append(1)
new_d = d.copy()
print(new_d) #输出:deque([1])

count(返回指定元素的出现次数)

import collections
d = collections.deque()
d.append(1)
d.append(1)
print(d.count(1)) #输出:2

extend(从队列右边扩展一个列表的元素)

import collections
d = collections.deque()
d.append(1)
d.extend([3,4,5])
print(d) #输出:deque([1, 3, 4, 5])

extendleft(从队列左边扩展一个列表的元素)

import collections
d = collections.deque()
d.append(1)
d.extendleft([3,4,5])
print(d)
#
# #输出:deque([5, 4, 3, 1])

index(查找某个元素的索引位置)

import collections
d = collections.deque()
d.extend(['a','b','c','d','e'])
print(d)
print(d.index('e'))
print(d.index('c',0,3)) #指定查找区间 #输出:deque(['a', 'b', 'c', 'd', 'e'])
# 4
# 2

insert(在指定位置插入元素)

import collections
d = collections.deque()
d.extend(['a','b','c','d','e'])
d.insert(2,'z')
print(d) #输出:deque(['a', 'b', 'z', 'c', 'd', 'e'])

pop(获取最右边一个元素,并在队列中删除)

import collections
d = collections.deque()
d.extend(['a','b','c','d','e'])
x = d.pop()
print(x,d) #输出:e deque(['a', 'b', 'c', 'd'])

popleft(获取最左边一个元素,并在队列中删除)

import collections
d = collections.deque()
d.extend(['a','b','c','d','e'])
x = d.popleft()
print(x,d) #输出:a deque(['b', 'c', 'd', 'e'])

remove(删除指定元素)

import collections
d = collections.deque()
d.extend(['a','b','c','d','e'])
d.remove('c')
print(d) #输出:deque(['a', 'b', 'd', 'e'])

reverse(队列反转)

import collections
d = collections.deque()
d.extend(['a','b','c','d','e'])
d.reverse()
print(d) #输出:deque(['e', 'd', 'c', 'b', 'a'])

rotate(把右边元素放到左边)

import collections
d = collections.deque()
d.extend(['a','b','c','d','e'])
d.rotate(2) #指定次数,默认1次
print(d) #输出:deque(['d', 'e', 'a', 'b', 'c'])

queue模块介绍
queue模块定义了下面的类和异常:
class queue.Queue(maxsize=0)

import queue
import time q = queue.Queue() #FIFO队列先进先出
q.put(2)
q.put(1)
q.put(3) while not q.empty():
next_item = q.get()
print(next_item)
time.sleep(1) 执行结果:
2
1
3

class queue.LifoQueue(maxsize=0)

import queue
import time q = queue.LifoQueue() #LIFO队列后进先出
q.put(2)
q.put(1)
q.put(3) while not q.empty():
next_item = q.get()
print(next_item)
time.sleep(1) 执行结果:
3
1
2

class queue.PriorityQueue(maxsize=0)

from queue import PriorityQueue
import time q = PriorityQueue() q.put((2, 'code'))
q.put((1, 'eat'))
q.put((3, 'sleep')) while not q.empty():
next_item = q.get()
print(next_item)
time.sleep(3) 执行结果:
(1, 'eat')
(2, 'code')
(3, 'sleep')

exception queue.Empty
exception queue.Full
Queue对象(Queue、LifoQueue或者PriorityQueue)提供了以下方法:
Queue.qsize()
返回队列的近似大小。注意,qsize() > 0并不能保证接下来的get()方法不被阻塞;同样,qsize() < maxsize也不能保证put()将不被阻塞。

import queue
import time q = queue.Queue() q.put(2)
q.put(1)
q.put(3)
q.put('python') print('queue long:%s'%q.qsize()) 执行结果:
queue long:4

Queue.empty()
如果队列是空的,则返回True,否则False。如果empty()返回True,并不能保证接下来的put()调用将不被阻塞。类似的,empty()返回False也不能保证接下来的get()调用将不被阻塞。

import queue q = queue.Queue()
que = queue.Queue() q.put(2)
q.put(1)
q.put(3)
q.put('python') print('q is empty? :%s'%q.empty())
print('que is empty? :%s'%que.empty())
执行结果:
q is empty? :False #队列不为空则返回False
que is empty? :True #队列未空则返回True

Queue.full()
如果队列满则返回True,否则返回False。如果full()返回True,并不能保证接下来的get()调用将不被阻塞。类似的,full()返回False也不能保证接下来的put()调用将不被阻塞。

import queue q = queue.Queue(maxsize=4)
que = queue.Queue() q.put(2)
q.put(1)
q.put(3)
q.put('python') print('q is full? :%s'%q.full())
print('que is full? :%s'%que.full())
执行结果:
q is full? :True
que is full? :False

Queue.put(item, block=True, timeout=None)
放item到队列中。如果block是True,且timeout是None,该方法将一直等待直到有队列有空余空间(默认block=True,timeout=None)。如果timeout是一个正整数,该方法则最多阻塞timeout秒并抛出Full异常。如果block是False并且队列满,则直接抛出Full异常(这时timeout将被忽略)。
block为True

import queue
import time q = queue.Queue(maxsize=2) #将q队列填满
q.put('python')
q.put('linux') print(time.ctime()) #打印当前时间
try: #捕获queue.Full异常
#q.put('shell', timeout=3) #默认block=True
#q.put('shell', True, timeout=3) #可以省略block=;直接写True;timeout=可以省略直接写3
q.put('shell', block=True, timeout=3) #q队列已满,再次将数据放入q中,将阻塞3s后抛出异常queue.Full
except queue.Full:
print('queue is full!')
print(time.ctime()) #打印当前时间,可看出q队列阻塞时长
执行结果:
Fri Nov 3 15:06:43 2017
queue is full!
Fri Nov 3 15:06:46 2017

block为False

import queue
import time q = queue.Queue(maxsize=2) #将q队列填满
q.put('python')
q.put('linux') print(time.ctime()) #打印当前时间
try: #捕获queue.Full异常
q.put('shell', False, timeout=3) #block为False时,timeout失效会立即抛出queue.Full异常;故timeout选项可以省略不写
except queue.Full:
print('queue is full!')
print(time.ctime()) #打印当前时间,可看出q队列阻塞时长 执行结果:

Queue.put_nowait(item)
等价于put(item, False)。
Queue.get(block=True, timeout=None)
从队列中移除被返回一个条目。如果block是True并且timeout是None(默认block=True,timeout=None),该方法将阻塞直到队列中有条目可用。如果timeout是正整数,该方法将最多阻塞timeout秒并抛出Empty异常。如果block是False并且队列为空,则直接抛出Empty异常(这时timeout将被忽略)。
block为True

import queue
import time q = queue.Queue(maxsize=2) #当前q队列填为空
print(time.ctime()) #打印当前时间
try: #捕获queue.Empty异常
q.get(True, 5) #Queue.get()获取数据阻塞5s
except queue.Empty:
print('queue is empty!')
print(time.ctime()) #打印当前时间,可看出q队列阻塞时长
执行结果:

block为False

import queue
import time q = queue.Queue(maxsize=2) #当前q队列填为空
print(time.ctime()) #打印当前时间
try: #捕获queue.Empty异常
#q.get(False, 5) #Queue.get()获取数据阻塞5s,block=/timeout=可以省略;block=False时timeout可以省略
q.get(False)
except queue.Empty:
print('queue is empty!')
print(time.ctime()) #打印当前时间,可看出q队列阻塞时长
执行结果:
Fri Nov 3 15:38:23 2017
queue is empty!
Fri Nov 3 15:38:23 2017

Queue.get_nowait()
等价于get(False)。
Queue.task_done()
表示一个先前的队列中的任务完成了。被队列消费者线程使用。对于每个get()获取到的任务,接下来的task_done()的调用告诉队列该任务的处理已经完成。
如果join()调用正在阻塞,当队列中所有的条目被处理后它将恢复执行(意味着task_done()调用将被放入队列中的每个条目接收到)。
如果调用次数超过了队列中放置的条目数目,将抛出ValueError异常。
Queue.join()
当一个条目被增加到队列时,未完成任务的计数将增加。当一个消费者线程调用task_done()时,未完成任务的计数将减少。当未完成任务的计数减少到0时,join()解锁。

#!/usr/bin/env python3 import queue
import time
import subprocess
import threading q = queue.Queue()
hosts = ['192.168.1.68', '192.168.1.118', '192.168.1.101', '192.168.1.250', '192.168.1.133'] def run():
while True: #防止线程少于len(hosts)时卡死,不用while循环线程数少时就会导致队列数据无法全部取完,就会造成queue.join()一直阻塞状态
host = q.get()
if host == '192.168.1.118': #如果ip等于192.168.1.118就休眠10S,用于判读queue.join()是否阻塞直到queue.task_doen()通知后接触阻塞
time.sleep(10)
print('host ip is:%s'% host)
q.task_done() #当前线程任务完成 def main():
for i in range(10):
t = threading.Thread(target=run)
t.setDaemon(True)
t.start() for item in hosts:
q.put(item) q.join() #阻塞直至所有线程queue.task_done()返回 start = time.time()
main()
print("Elapsed Time: %s" % (time.time() - start))
执行结果:
host ip is:192.168.88.68
host ip is:192.168.68.101
host ip is:192.168.66.250
host ip is:192.168.88.133
host ip is:192.168.88.118
Elapsed Time: 10.013836145401001 #由于192.168.1.118大约阻塞了10S

python 中的queue, deque的更多相关文章
- python中的Queue
一.先说说Queue(队列对象) Queue是python中的标准库,可以直接import 引用,之前学习的时候有听过著名的“先吃先拉”与“后吃先吐”,其实就是这里说的队列,队列的构造的时候可以定义它 ...
- python中的Queue(队列)详解
一.Queue简介 python中的队列分类可分为两种: 1.线程Queue,也就是普通的Queue 2.进程Queue,在多线程与多进程会介绍. Queue的种类: FIFO: Queue.Que ...
- python 中的queue 与多进程--待继续
一.先说说Queue(队列对象) Queue是python中的标准库,可以直接import 引用,之前学习的时候有听过著名的“先吃先拉”与“后吃先吐”,其实就是这里说的队列,队列的构造的时候可以定义它 ...
- python中的Queue模块
queue介绍 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue.python3直接queue即可 在python中,多个线程之间的数据 ...
- python中基于queue的打印机仿真算法
使用打印机的模型是queue中最经典的应用之一,这里就回顾一下queue在这里的使用方法和 起的重要作用. 为了仿真打印状态,这里需要把真实环境中的三个物理模型要建模出来,分别是:打印者,打印 任务, ...
- python中使用queue实现约瑟夫环(约瑟夫问题)求解
约瑟夫问题:是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围. 从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列: 依 ...
- 练习--python中的Queue与多进程(multiprocessing)
按官方说法: This module is OBSOLETE and is only provided on PyPI to support old projects that still use i ...
- Python中模块之queue的功能介绍
模块之queue的功能介绍 队列的分类: 队列主要要分为两种 1.双向队列 2.单项队列 1. 单项队列 创建单项队列 格式:queue.Queue(obj) 例如:que = queue.Queue ...
- java/python中的队列
Queue<TreeNode> que=new LinkedList<>(); 用linkedlist实现队列,offer,poll进出队列,peek对列顶部元素 python ...
随机推荐
- 【Alpha】技术规格说明书
由于第1周已经写过技术规格说明书(设计文档),本周更新了上一版内容. Github地址:https://github.com/buaase/Phylab-Web/blob/master/docs/Ba ...
- 第二阶段每日站立会议Third Day
昨天对图片显示的大小进行调整 今天对于程序中的字体显示进行细化修改,使界面更美观 遇到的问题:当图片太小时,显示一块灰色区域,不美观
- “吃神么,买神么”的第二个Sprint计划(计划过程内容)
“吃神么,买神么”项目Sprint计划 ——6.1(第二天)立会内容与进度 团队组员各自任务: 陈键.吴舒婷:继续完善前台设局与布局 林欢雯.冯美欣:开展后台的界面的设计与布局 任务的进度: 陈键. ...
- git学习(一) 如何将项目上传到github
用了github有了段时间,但是感觉都是断断续续的,这次花了点时间来总结下,已方便下次忘记的时候拿出来看一下: 自己主要是参考了这个网站来学习的: git教程 -廖雪峰 第一步: 创建github账号 ...
- C1WPF制作OLAP Cube浏览工具
经过前期一段时间对WPF的学习了解,相信大家对WPF有了一定的了解.今天我们一起来了解使用Component One(简称C1)的WPF控件制作CUBE浏览工具.其实这个OLAP控件官方已经有了很详细 ...
- vue 实战语法错误导致的问题记录
1. 在组件中引入mapActions import mapActions from 'vuex' 而不是 getActions 2.引入 mutations-type.js import ...
- Workstation和Virtualbox的虚拟机磁盘扩容方式.
1. 虚拟机磁盘管理, 更改磁盘格式是一个场景 还有一个场景是 硬盘空间不够了 需要扩充. 方法主要有两个. 如果是workstation的的虚拟机. 并且没有快照 可以直接GUI操作 如下图: 虚拟 ...
- 命令行方式操作O365
这几天公司为O365启用了双因子认证,期间出了些小问题,导致我无法使用管理员账号登入控制台,但是Powershell的方法依旧可以.所以我觉得还是有必要把图形化操作改成脚本操作,以备不时之需.以后凡是 ...
- [转贴]systemd 编写服务管理脚本
[转贴]sparkdev大神的博客, 关于 systemd的配置文件的 介绍, 自己之前二进制安装 k8s 时 超过一个 service文件 但是当时不明不白的. 现在再学习一下大神的文章 的确牛B ...
- command symbol & mac & emoji
command symbol & mac & emoji how to input command symbol in mac ? https://apple.stackexchang ...