线程queue

线程之间已经是共享数据的,为什么还使用线程queue?

线程需要自己加锁,线程queue帮我们处理好加锁的问题

有三种不同的用法

第一种方法:

class queue.Queue(maxsize=0) #队列:先进先出

put('four',block=,timeout=)

第一个参数: 放入的数据

第二个参数:

block=True 时 队列满了,再放数据不抛出异常,程序卡主,不指定block参数,默认是True

block=false时,队列满了,再放数据,不阻塞,抛出异常

源码

 def put(self, item, block=True, timeout=None):

第三个参数 timeout:

设置队列满后,再放数据发生的阻塞时间,如果过了这个时间,还没有取数据,队列还是满的,就抛出异常,就算block=True也抛出异常

put()

设置只能放3个数据,队列满,再去放第四个数据,程序卡主 阻塞了

默认block参数为True

import queue

q = queue.Queue(3)  # 先进先出 --> 队列

q.put("first")
q.put("second")
q.put("third") q.put("four")

block=False时候,队列满了,再放数据,不阻塞,抛出异常

import queue

q = queue.Queue(3)  # 先进先出 --> 队列

q.put("first")
q.put("second")
q.put("third") q.put("four",block=False) '''
q.put("four",block=False)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 130, in put
raise Full
queue.Full
'''

timeout

设置队列满后,再放数据发生的阻塞时间,如果过了这个时间,还没有取数据,队列还是满的,就抛出异常,就算block=True也抛出异常

阻塞3秒,3秒后,队列还满,抛出异常

import queue

q = queue.Queue(3)  # 先进先出 --> 队列

q.put("first")
q.put("second")
q.put("third") q.put("four",block=True, timeout=3) '''
q.put("four",block=True, timeout=3)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 141, in put
raise Full
queue.Full
'''

q.put_nowait('four') ==  q.put('four', block=False)

import queue

q = queue.Queue(3)  # 先进先出 --> 队列

q.put("first")
q.put("second")
q.put("third") q.put_nowait('four') '''
q.put_nowait('four')
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 184, in put_nowait
return self.put(item, block=False)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 130, in put
raise Full
queue.Full
'''

取数据 get()

和put一样

put(block=,timeout=)

第一个参数:

block=True 时 队列取空了数据,再取数据不抛出异常,程序卡主,不指定block参数,默认是True

block=false时,队列取空数据,再取数据,不阻塞,抛出异常

第二个参数

timeout:

设置队列取空数据,再取数据后的阻塞时间,如果过了这个时间,还没有放数据,队列还是空的,就抛出异常,就算block=True也抛出异常

源码

def get(self, block=True, timeout=None):
import queue

q = queue.Queue(3)  # 先进先出 --> 队列

q.put("first")
q.put("second")
q.put("third") # 取数据
print(q.get())
print(q.get())
print(q.get()) '''
first
second
third
'''

队列取完后,再去取数据,程序卡主,阻塞了

import queue

q = queue.Queue(3)  # 先进先出 --> 队列

q.put("first")
q.put("second")
q.put("third") # 取数据
print(q.get())
print(q.get())
print(q.get())
print(q.get())

block=False时,队列取完后,再去取数据,抛出异常

import queue

q = queue.Queue(3)  # 先进先出 --> 队列

q.put("first")
q.put("second")
q.put("third") # 取数据
print(q.get())
print(q.get())
print(q.get())
print((q.get(block=False))) '''
print((q.get(block=False)))
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 161, in get
raise Empty
queue.Empty
'''

q.get_nowait()  == q.get(block=False) 一样

import queue

q = queue.Queue(3)  # 先进先出 --> 队列

q.put("first")
q.put("second")
q.put("third") # 取数据
print(q.get())
print(q.get())
print(q.get())
print(q.get_nowait()) # == q.get(block=False) '''
print(q.get_nowait()) # == q.get(block=False)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 192, in get_nowait
return self.get(block=False)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 161, in get
raise Empty
queue.Empty
'''

timeout:

设置队列取空数据,再取数据后的阻塞时间,如果过了这个时间,还没有放数据,队列还是空的,就抛出异常,就算block=True也抛出异常

import queue

q = queue.Queue(3)  # 先进先出 --> 队列

q.put("first")
q.put("second")
q.put("third") # 取数据
print(q.get())
print(q.get())
print(q.get())
print((q.get(block=True, timeout=3)))

第二种方法:

class queue.LifoQueue(maxsize=0) #堆栈:后进先出

用法和Queue类一样

import queue

q = queue.LifoQueue(3)  # 堆栈:后进先出

q.put("first")
q.put("second")
q.put("third") # 取数据
print(q.get())
print(q.get())
print(q.get()) '''
third
second
first
'''

第三种方法

class queue.PriorityQueue(maxsize=0) #优先级队列:存储数据时可设置优先级的队列

put进入一个元组,元组的第一个元素是优先级
(通常是数字,也可以是非数字之间的比较),数字越小优先级越高
第二个元素是放入的数据,可以是列表,字符串,字典等
import queue

q = queue.PriorityQueue(3)  # 堆栈:后进先出

'''
put进入一个元组,元组的第一个元素是优先级
(通常是数字,也可以是非数字之间的比较),数字越小优先级越高
''' q.put((40,"first"))
q.put((10,"second"))
q.put((30,"third")) # 取数据
print(q.get())
print(q.get())
print(q.get()) '''
结果(数字越小优先级越高,优先级高的优先出队):
(10, 'second')
(30, 'third')
(40, 'first')
'''
结果 数字越小优先级越高,优先级高的优先出队
												

python 并发编程 多线程 线程queue的更多相关文章

  1. 并发编程~~~多线程~~~线程queue, 事件event,

    一 线程queue 多线程抢占资源,只能让其串行. 互斥锁 队列 import queue q = queue.Queue() # 先进先出 q = queue.LifoQueue() # 先进后出 ...

  2. python 并发编程 多线程 线程理论

    操作系统比作一家公司,进程相当于一个部门  线程相当于一个部门的成员 进程之间是互相隔离的 一 什么是线程 1. 每启动一个进程 至少有一个线程,  在传统操作系统中,每个进程有一个地址空间,而且默认 ...

  3. python 并发编程 多线程 目录

    线程理论 python 并发编程 多线程 开启线程的两种方式 python 并发编程 多线程与多进程的区别 python 并发编程 多线程 Thread对象的其他属性或方法 python 并发编程 多 ...

  4. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

  5. python并发编程&多线程(二)

    前导理论知识见:python并发编程&多线程(一) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 官网链 ...

  6. python并发编程之线程/协程

    python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ...

  7. python并发编程&多线程(一)

    本篇理论居多,实际操作见:  python并发编程&多线程(二) 一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一 ...

  8. Python并发编程——多线程与协程

    Pythpn并发编程--多线程与协程 目录 Pythpn并发编程--多线程与协程 1. 进程与线程 1.1 概念上 1.2 多进程与多线程--同时执行多个任务 2. 并发和并行 3. Python多线 ...

  9. python并发编程——多线程

    编程的乐趣在于让程序越来越快,这里将给大家介绍一个种加快程序运行的的编程方式--多线程   1 著名的全局解释锁(GIL) 说起python并发编程,就不得不说著名的全局解释锁(GIL)了.有兴趣的同 ...

随机推荐

  1. 10.17小作业 基于TCP开发一款远程CMD程序

    基于TCP开发一款远程CMD程序 客户端连接服务器后,可以向服务器发送命令 服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端 注意: 执行系统指令使用subprocess ...

  2. 本机的IP地址无法打开(Vue项目)

    1, 首先找到使用vue脚手架建立项目config文件中的index.js文件2, 修改dev里面的host属性值:改成 host: ‘0.0.0.0’3, 最后在局域网下,使用自己的ip进行连接,同 ...

  3. EF Core命令

    新建 Add-Migration init Update-Database init 修改model后,执行迁移的命令 更新数据库 每次更新都要{update}修改 Add-Migration {up ...

  4. 学习springboot(三)——springboot+mybatis出现org.apache.ibatis.binding.BindingException: Invalid bound state

    有段时间没搭建过了生疏了,记录下出现此情况且你能通过注解的方式正常进行数据库操作,只是通过mapper.xml不行就可以看看这个了.主要问题应该是配置上,不要太自信自己,再仔细找找.1.查看xml是否 ...

  5. Release和Debug的区别

    Debug与Release版本的区别 Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动.如果我们愿意,我们完全可以把Debug ...

  6. JavaScript分支结构Ⅱ—switch-case

    ㈠switch-case 使用场合 优先用于等值判断的条件中   ㈡switch-case 语句执行逻辑 switch case语句是一种特殊的分支结构,可以根据一个表达式的不同取值,从不同的程序入口 ...

  7. H5+JAVA的文件上传,断点续传

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  8. BZOJ 1095: [ZJOI2007]Hide 捉迷藏 动态点分治+堆

    写了7k多,可以说是一己之力切掉了这道毒瘤题~ 开 $3$ 种堆,分别维护每个子树最大深度,以及每个节点在点分树中对父亲的贡献,和全局的最优解. 由于需要支持堆的删除,所以写起来特别恶心+麻烦. 细节 ...

  9. HTML DOM的学习

    请看下面的 HTML 片段: <html> <head> <title>DOM 教程</title> </head> <body> ...

  10. JavaScript疑难杂症系列-事件

    事件这块知识点虽然是老生长谈的,但对于我来说多多整理,多多感悟,温故知新,每次看看这块都有不同的收获.(在这里我不会长篇大论,只会挑重点;具体的小伙伴们自行查找) 什么是事件 在编程时系统内发生的动作 ...