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 ...
随机推荐
- .NET环境下基于RBAC的访问控制
.NET环境下基于RBAC的访问控制 Access Control of Application Based on RBAC model in .NET Environment 摘 要:本文从目前信息 ...
- 代码的坏味道(4)——过长参数列(Long Parameter List)
坏味道--过长参数列(Long Parameter List) 特征 一个函数有超过3.4个入参. 问题原因 过长参数列可能是将多个算法并到一个函数中时发生的.函数中的入参可以用来控制最终选用哪个算法 ...
- Elasticsearch+Logstash+Kibana教程
参考资料 累了就听会歌吧! Elasticsearch中文参考文档 Elasticsearch官方文档 Elasticsearch 其他——那些年遇到的坑 Elasticsearch 管理文档 Ela ...
- MVC中路由
篇目 介绍 路线的性质 了解缺省路由 用一个例子的路由 结论 介绍 本文介绍了MVC中的路由.如何执行的路线是由路由引擎和如何定义的URL路由. ASP.NET MVC的路由是一个模式匹配系统,负责传 ...
- Moon.Orm 5.0 (MQL版) 实际开发实例Demo
http://www.cnblogs.com/humble/p/4593133.html (文章新地址) http://www.cnblogs.com/humble/p/4593133.html ...
- 为.NET搭建Linux的开发环境,鄙视那些将简单事情复杂化的人
写在前面的吐槽 原本跨平台开发很容易的事情, 很多人把它弄得很麻烦,给外人的感觉:你们.NET跨平台开发好不成熟,好麻烦哦. ..................................... ...
- angularjs的表单验证
angularjs内置了常用的表单验证指令,比如min,require等.下面是演示: <!DOCTYPE html> <html> <head> <meta ...
- php实现设计模式之 备忘录模式
<?php /*备忘录模式:在不破坏封装的前提下,获取对象的内部状态,并且在对象外保存该状态.这样就可以将该对象恢复到保存之前的状态(行为模式) * * 发起人:记录当前时刻的内部状态,负责定义 ...
- 利用SCORE法则来总结一次偷懒的单元测试过程
最近遇到一个单元测试的问题,本周正好学个了一个SCORE法则,这里正好练练手应用此法则将问题的前因后果分享给大家. S:背景 代码要有单元测试,检测的标准就是统计代码的单元测试覆盖率,程序员需要达到 ...
- B树、B+树的实现
B树的定义 假设B树的度为t(t>=2),则B树满足如下要求:(参考算法导论) (1) 每个非根节点至少包含t-1个关键字,t个指向子节点的指针:至多包含2t-1个关键字,2t个指向子女的指针 ...