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 ...
随机推荐
- Easyui datagrid editor为combobox时指定数据源
当在datagrid行内部应用添加编辑操作时,引入combobox是非常方便的操作,我在引入combobox时对数据源这快做个总结,在做demo的过程中遇到个问题,就是当你选择了下拉框的值后点击保存, ...
- Fragment基础----创建
1,Fragment的目的及应用场景 fragment 是3.0后引入的类,其字面翻译为“碎片”. 目的是将activity划分成许多单元再进行组合,可以根据不同分辨率屏幕,在不同状态下,灵活创建优化 ...
- Eclipse与Android源码中ProGuard工具的使用
由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...
- HTML基本元素(二)
1.图像 <img src="URL" alt="" /> 说明 src 定义图像的url alt 定义图像的替代文本 width 设置图像的宽度 ...
- Sql Server函数全解(五)之系统函数
系统信息包括当前使用的数据库名称,主机名,系统错误消息以及用户名称等内容.使用SQL SERVER中的系统函数可以在需要的时候获取这些信息.下面介绍系统函数的作用和使用方法. 1.返回表中指定字段的 ...
- CSS3和jQuery实现的自定义美化Checkbox
效果图: 是不是比默认的好看多了,个人的审美观应该还是可以的. 当然我们可以在这里查看DEMO演示. 接下来我们一起来看看实现这款美化版Checkbox的源代码.主要思路是利用隐藏原来的checkbo ...
- C++中关于[]静态数组和new分配的动态数组的区别分析
这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下 本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加 ...
- 分布式系统设计权衡之CAP
写在最前: 1.为什么学习并记录分布式设计理念一系列相关的东西 在日常工作中系统设计评审的时候,经常会有一些同事抛出一些概念,高可用性,一致性等等字眼,他们用这些最基本的概念去反驳系统最初的设计,但是 ...
- [注意]SerialPort操作PCI-1621D多串口卡,出现异常"参数不正确"
开发LED大屏显示.40-20mA模拟量输出的时候,经常要与串口打交道.但是Windows自带的SerialPort串口操作组件貌似兼容性 不是太好,或是SerialPort本身有BUG,在操作PCI ...
- Java基础学习总结 -- 图形用户界面GUI
虽然目前Java算不上前端开发的主力,但是作为Java入门基础的一部分,学习Java的GUI编程还是有必要的,而且可以做出一些小且有趣的图形程序来提高学习热情.本篇学习总结均为一个Beginner的笔 ...