Python进阶【第二篇】多线程、消息队列queue
1.Python多线程、多进程
目的提高并发
1.一个应用程序,可以有多进程和多线程
2.默认:单进程,单线程
3.单进程,多线程
IO操作,不占用CPU
python的多线程:IO操作,多线程提供并发
计算性操作
多进程提高并发
4.GIL,全局解释器锁
总结:
多进程,多线程,提供并发
IO密集型:多线程
计算密集型:多进程
2.threading模块
threading模块对象 | 描述 |
Thread | 表示一个线程的执行的对象 |
Lock | 锁原语对象 |
RLock | 可重入锁对象。使单线程可以再次获得已经获得了的锁(递归锁定) |
Event | 通用的条件变量。多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活 |
BoundedSemaphore | 每次允许几个线程通过 |
Timer | 等待多久在开始运行 |
3.如何创建一个线程
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # 1.先导出threading模块 import threading import time def f1(arg): time.sleep(2) print(arg) for i in range(10): # 2.创建一个线程对象 t = threading.Thread(target=f1,args=(i,)) # 创建一个线程那你想让它执行那些操作呢,就是target指定 # 假设上面的f1是一个函数,那么如果函数可以传参数就用args=(参数1,参数2) t.start() # t.start() # 并不代表当前线程会被立即执行 # setDaemon方法,主进程执行完就退出不在等待子进程结束 # t.setDaemon(True) # 表示主线程到此等待,直到子线程执行完毕 t.join() print("end") # 默认情况下主线程不会等待子线程t.start()执行完,而是直接执行下面的print("end"),但是程序不会退出,而是等子进程执行结束后才退出程序
4.定时器Timer()
#!/usr/bin/env python # _*_ coding:utf-8 _*_ from threading import Timer def func(): print("hello world") # 等1秒钟在执行func函数 t = Timer(1,func) t.start()
5.消息队列queue模块
queue模块函数 | 描述 |
queue(size) | 创建一个大小为size的queue对象 |
queue对象函数 | |
qsize() | 返回队列的大小 |
empty() | 如果队列为空返回True,否则返回False |
full() | 如果队列已满返回True,否则返回False |
put(item,block=0) | 把item放到队列中,如果给了block=False表示没有数据时不阻塞,直接报错 |
get(block=False) | 在队列中取一个对象,默认block=True,如果给了block=False表示没有数据时不阻塞,直接报错 |
示例:
1.queue.Queue 先进先出队列 2.queue.LifoQueue,后进先出队列 3.queue.PriorityQueue,优先级队列 4.queue.deque,双向队列 1.先进先出 #!/usr/bin/env python # _*_ coding:utf-8 _*_ import queue #创建一个先进先出队列 # put 存放数据,是否阻塞,是否有超时时间 # put也可以传参数: # timeout=2表示如果队列满了等待2秒如果有位置就存进去,如果没有就报错 # block=False 表示如果队列满了,不等待直接报错 # get 取出数据,默认阻塞,队列中没有数据时阻塞等待数据 # get也可以传参数: # block=False 表示不阻塞,没有数据直接报错 # timeout=2 取数据时等待的超时时间 # # Queue()可以接收参数Queue(10)表示最多接收10个数据 # empty() 如果队列为空返回True,有数据则返回False q = queue.Queue() # 队列中是否有数据 print(q.empty()) # 向队列中添加数据 q.put(111) q.put(222) q.put(333) # 队列中是否有数据 print(q.empty()) # 查看队列中有多少数据 print("当前队列中有 [%s] 个数据"%q.qsize()) # 获取数据 print(q.get()) # 获取数据 print(q.get()) # 取出两个在查看 print("当前队列中有 [%s] 个数据"%q.qsize()) 2.后进先出队列 #!/usr/bin/env python # _*_ coding:utf-8 _*_ import queue q = queue.LifoQueue() q.put(123) q.put(456) print(q.get()) 3.双向队列 #!/usr/bin/env python # _*_ coding:utf-8 _*_ import queue q = queue.deque() # 写入数据 q.append(") q.append(") # 在左边插入输入 q.appendleft(") # 获取数据 print(q.pop()) # 获取最左边的数据 print(q.popleft()) 4.优先级队列 #!/usr/bin/env python # _*_ coding:utf-8 _*_ import queue q = queue.PriorityQueue() # 优先级队列写入数据需要传两个值,第一个值是优先级数字越小优先级越高,第二个参数是数据 q.put((1,"test1")) q.put((2,"test2")) q.put((0,"test0")) print(q.get())
生产者消费者模型(队列)
6.自定义线程池
#!/usr/bin/env python # _*_ coding:utf-8 _*_ import queue import threading import time class Threadpool: """ 自定义线程池 """ def __init__(self,maxsize=5): """ 初始化 :param maxsize: 队列存放数据的个数 """ self.maxsize = maxsize # 创建一个队列 self._q = queue.Queue(maxsize) # maxsize多大就创建一个线程对象 for i in range(maxsize): self._q.put(threading.Thread) def get_thread(self): """ 获取一个线程对象 等同于创建了一线线程对象t = threading.Thread :return: """ return self._q.get() def add_thread(self): """ 添加一个线程对象到队列中 :return: """ self._q.put(threading.Thread) pool = Threadpool(5) def task(arg,p): """ 任务 :param arg: :param p: p 等于接收pool对象 :return: """ print(arg) time.sleep(1) # 队列中减少一个线程对象就在添加一个进去,保证队列中始终是5个 p.add_thread() for i in range(100): t = pool.get_thread() obj = t(target=task, args=(i,pool)) obj.start()
Python进阶【第二篇】多线程、消息队列queue的更多相关文章
- python消息队列Queue
实例1:消息队列Queue,不要将文件命名为"queue.py",否则会报异常"ImportError: cannot import name 'Queue'" ...
- 消息队列Queue大全
消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...
- 消息队列queue
一.queue 在多线程编程中,程序的解耦往往是一个麻烦的问题,以及在socket网络编程中也会有这样的问题.recv 和send之间,如果服务端有消息,问题需要发送给客户端,而那边的recv 被主程 ...
- Python人工智能第二篇:人脸检测和图像识别
Python人工智能第二篇:人脸检测和图像识别 人脸检测 详细内容请看技术文档:https://ai.baidu.com/docs#/Face-Python-SDK/top from aip impo ...
- python【第十一篇】消息队列RabbitMQ、缓存数据库Redis
大纲 1.RabbitMQ 2.Redis 1.RabbitMQ消息队列 1.1 RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议 ...
- python多进程之间的通信:消息队列Queue
python中进程的通信:消息队列. 我们知道进程是互相独立的,各自运行在自己独立的内存空间. 所以进程之间不共享任何变量. 我们要想进程之间互相通信,传送一些东西怎么办? 需要用到消息队列!! 进程 ...
- python学习笔记——multiprocessing 多进程组件-队列Queue
1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...
- python基本数据结构栈stack和队列queue
1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...
- python 3.x 学习笔记16 (队列queue 以及 multiprocessing模块)
1.队列(queue) 用法: import queue q = queue.Queue() #先进先出模式 q.put(1) #存放数据在q里 作用: 1)解耦 2)提高效率 class qu ...
随机推荐
- 归一化变换 Normalizing transformations
归一化变换包含两个部分,图像坐标的平移和尺度的缩放.进行归一化的变换不但能够提高处理结果的精确度,而且通过选择一个标准的坐标系预先的消除了图像尺度和坐标原点的选择对算法最终结果的影响. 归一化变换的步 ...
- jQuery-1.9.1源码分析系列(六) 延时对象应用——jQuery.ready
还记不记得jQuery初始化函数jQuery.fn.init中有这样是一个分支 //document ready简便写法$(function(){…}) } else if ( jQuery.isFu ...
- 【原创】kafka server源代码分析(二)
十四.AbstractFetcherManager.scala 该scala定义了两个case类和一个抽象类.两个case类很简单: 1. BrokerAndFectherId:封装了一个broker ...
- androidstudio报错
今天换一下IDE,结果上来就给我报错, androidstudio message:Error:java.lang.UnsupportedClassVersionError: com/android/ ...
- Lind.DDD.Paging分页模块介绍
回到目录 分页组件网上有很多,MVC.Pager,JSPager等,通过实现方式大体分为前端分页和后端分页,前端分页是前台对list内存本地集合进行分页,缺点就是在大数据情况下,内存占用过高:后端分页 ...
- Java源代码-迭代器模式
Java无疑是最成功的项目之一了,而在其中学习设计模式和架构设计,无疑是最好不过了. 概念: 提供一种方法访问容器中的各个元素,而又不暴露该对象的内部细节. 使用场景: 和容器经常在一起,我们定义了一 ...
- github的pull request是指什么意思?有什么用处
github的pull request是指什么意思? 来看看某乎某位阿牛的理解,多么的简单粗暴! 我尝试用类比的方法来解释一下 pull reqeust.想想我们中学考试,老师改卷的场景吧.你做的试卷 ...
- H5学习
1.html{font-size:62.5%;}//不用font-size:10px的原因:(因为设了62.5%后就有1rem = 10px,便于用rem来指定元素的尺寸,这样响应式的时候可以直接改变 ...
- VS2013新建MVC5项目,使用nuget更新项目引用后发生Newtonsoft.Json引用冲突的解决办法
错误信息如下: 错误 3 类型“Newtonsoft.Json.JsonPropertyAttribute”同时存在于“c:\Program Files (x86)\Microsoft V ...
- Docker的4种网络模式
我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: · host模式,使用--net=host指定. · container ...