第十篇:异步IO、消息队列
一、协程
二、异步IO_Gevent
三、协程异步IO操作
四、事件驱动模型
五、IO多路复用
六、异步IO理论
一、回顾
线程 vs 进程
线程:CPU最小调度单位,内存共享;
线程同时修改同一份数据是必须加锁,mutex互斥锁
递归锁
join 等待线程执行结果;
进程:资源集合
二、多进程
IO操作不占用CPU
计算占用CPU
python多线程不适合CPU密集操作型的任务,适合IO密集型的任务;
启动一个多进程:
import multiprocessing
import time
def run(name):
time.sleep(2)
print("hello")
if __name__ == '__main__':
for i in range(10):
p = multiprocessing.Process(target=run, args=('bob',))
p.start()
取进程ID
os.getppid() #父进程
os.getpid() #子进程
每个进程都是由父进程启动;
三、进程Queue数据传递
form multiprocessing import Process, Queue
子线程的queue能访问父线程的queue,内存共享;
子进程的queue不能访问父进程的queue,内存独立;
子进程要访问父进程的queue,必须传入进程queue;
相当于克隆一份queue给子进程;pickle过程;
四、pipe进程间管道通信
from multiprocession import Process, Pipe
parent_conn,child_conn = Pipe()
管道两头,一头传给子进程,一头留在父进程;
process(target=f,args=(child_conn))
parent_conn.recv() #父进程里收数据
def f():
child_conn.send() #子进程里发数据
进程数据共享:
with Manager() as manager:
d=manager.dict() #生成一个字典,可在多个进程间共享和传递;
l=manager.list() #生成一个列表,可在多个进程间共享和传递;
五、进程锁
from multiprocession import Lock
lock = Lock()
lock.acquire()
lock.release()
进程锁存在的意义,屏幕打印;
六、进程池
from multiprocession import Pool
pool = Pool(5) #允许进程池里同时放入5个进程;
pool.apply(func=Foo,args=(i,),callback=Bar)
pool.close()
pool.join()
先close 再join
apply 是同步执行,串行;
apply_async 是异步执行,并行
在windows上起多进程必须加 if __name__ == '__main__':
如果手动执行脚本会执行,如果调用不执行;
callback 回调函数;前面函数执行完后执行回调函数;
回调函数是主进程调用,主进程连接数据库长连接;
七、协程
协程就是一种用户态的轻量级线程;
遇到IO操作就切换;
greenlet #手动切换协程
form greenlet import greenlet
def test1():
print(12)
gr2.swithc()
print(34)
gr2.swithc()
def test2():
print(56)
gr1.swithc()
print(78)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.swithc()
gevent #自动切换协程
import gevent
def foo():
print("running foo")
gevent.sleep(2)
print("swithc to foo")
def bar():
print("running bar")
gevent.sleep(2)
print("swithc to bar")
gevent.joinall([gevent.spawn(foo),gevent.spawn(bar),])
from gevent import monkey
monkey.patch_all() #把当前程序的所有的io操作单独的做上标记
打上补丁gevent能识别IO操作;
八、事件驱动模型
检测到事件,放入事件队列,调用各自的函数处理事件;
事件驱动是一种编程范式;
九、IO多路复用
1.等待数据准备
2.将数据从内核空间拷贝到进程中;
阻塞I/O,等待数据和拷贝数据都阻塞
非阻塞,等待数据时非阻塞,特点是用户需要不断得询问内核数据有没有准备好;
I/O多路复用,select,poll,epoll
异步I/O,
epoll没有最大连接数的限制;
asyncio 异步IO
十、IO多路复用select代码实现
import select
import socket
import queue
server = socket.socket()
server.bind('localhost',9000)
server.listen(1000)
server.setblocking(False) #不阻塞
inputs = [server,]
outputs = []
readable,writeable,exceptional = select.select(inputs,outputs,inputs)
server.accept()
第十篇:异步IO、消息队列的更多相关文章
- Python之路,Day10 - 异步IO\数据库\队列\缓存
Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...
- (十四)RabbitMQ消息队列-启用SSL安全通讯
原文:(十四)RabbitMQ消息队列-启用SSL安全通讯 如果RabbitMQ服务在内网中,只有内网的应用连接,我们认为这些连接都是安全的,但是个别情况我们需要让RabbitMQ对外提供服务.这种情 ...
- (十二)RabbitMQ消息队列-性能测试
原文:(十二)RabbitMQ消息队列-性能测试 硬件配置 宿主机用的联想3850X6的服务器四颗E7-4850v3的处理器,DDR4内存,两块1.25TB的pcie固态.在宿主机上使用的事esxi5 ...
- Python 第七篇:异步IO\数据库\队列\缓存
Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Tws ...
- Python之路第一课Day10--随堂笔记(异步IO\数据库\队列\缓存)
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...
- python 自动化之路 day 10 协程、异步IO、队列、缓存
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Twsited网络框架 引子 到目 ...
- 异步IO\数据库\队列\缓存\RabbitMQ队列
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...
- Day9 - 异步IO\数据库\队列\缓存
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...
- Python - 异步IO\数据库\队列\缓存
协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,协程一定是在单线程运行的. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和 ...
- Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用
posix消息队列与system v消息队列的区别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则能够返回随意指定优先级的消息. (2)当往一个空队列放 ...
随机推荐
- Java Eclipse JUnit单元测试
1 package com.bytezreo.ut; 2 3 import org.junit.Test; 4 5 /** 6 * 7 * @Description Java中的JUnit单元测试 8 ...
- 解决element-ui的date-picker组件的picker-options属性不生效的问题
网上查半天都没查到,好像没人写,于是俺怀着激动的心情来记录下 项目来需求,说要控制日期选择的最大最小范围,看似简单,实则藏深坑! 小白的我天真地按照网上的例子(主要是官网也不给一个!)写完如下: 1. ...
- windows下如何结束Tomcat进程
问题描述: 使用IDEA启动java中的SSM项目之后,服务正常运行.操作过程中不小心把IDEA 开发工具给关闭啦,导致tomcat没有正常停止,使用的端口8080仍然被占用.再次 打开IDEA,启动 ...
- [VueJsDev] 基础知识 - snippetsLab 代码片段
[VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html 代码片段 ::: details 目录 目录 代码片段 St ...
- 已安装docker-compose,安装harbor时还是提示docker-compose未安装或者Permission denied的解决方案
安装Harbor时,下载安装了docker-compose并赋予权限 sudo curl -L "https://github.com/docker/compose/releases/dow ...
- Morris遍历:常数空间遍历二叉树
Morris遍历 cur有左树且第一次遍历到,去左孩子 没左树或者第二次遍历到,去右孩子 没右树,去后继节点 得到Morris序.对于该序列中出现两次的节点,只保留第一次遍历,结果就是先序遍历.只保留 ...
- ubuntu 14.04 x86_64编译安装Skyeye1.3.5RC1的心得
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文发布于 2014-11-09 09:19:03 ...
- 从时间复杂度的角度出发,list和vector之间查找,插入,删除等数据操作的区别
list和vector是STL(标准模板库)中常用的两种序列容器,它们各自在不同类型的操作上有着不同的优势.下面是list和vector在不同操作上的擅长之处: list的擅长操作 插入和删除操作:l ...
- 重返ubuntu世界
一直对"重返"两个字充满了情怀感,因为会想起小时候看的一本龙珠同人的标题,它就唤作<重回龙珠世界>.最近这五年基本都是在MacOS下工作和学习的,也习惯用MacOS.就 ...
- FPGA 原语之一位全加器
FPGA原语之一位全加器 1.实验原理 一位全加器,三个输入,两个输出.进位输出Cout=AB+BC+CA,本位输出S=A异或B异或C.实验中采用三个与门.一个三输入或门(另外一个是两个或门,功能一致 ...