一、协程

二、异步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、消息队列的更多相关文章

  1. Python之路,Day10 - 异步IO\数据库\队列\缓存

    Python之路,Day9 - 异步IO\数据库\队列\缓存   本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...

  2. (十四)RabbitMQ消息队列-启用SSL安全通讯

    原文:(十四)RabbitMQ消息队列-启用SSL安全通讯 如果RabbitMQ服务在内网中,只有内网的应用连接,我们认为这些连接都是安全的,但是个别情况我们需要让RabbitMQ对外提供服务.这种情 ...

  3. (十二)RabbitMQ消息队列-性能测试

    原文:(十二)RabbitMQ消息队列-性能测试 硬件配置 宿主机用的联想3850X6的服务器四颗E7-4850v3的处理器,DDR4内存,两块1.25TB的pcie固态.在宿主机上使用的事esxi5 ...

  4. Python 第七篇:异步IO\数据库\队列\缓存

    Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Tws ...

  5. Python之路第一课Day10--随堂笔记(异步IO\数据库\队列\缓存)

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

  6. python 自动化之路 day 10 协程、异步IO、队列、缓存

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Twsited网络框架 引子 到目 ...

  7. 异步IO\数据库\队列\缓存\RabbitMQ队列

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

  8. Day9 - 异步IO\数据库\队列\缓存

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

  9. Python - 异步IO\数据库\队列\缓存

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,协程一定是在单线程运行的. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和 ...

  10. Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用

    posix消息队列与system v消息队列的区别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则能够返回随意指定优先级的消息. (2)当往一个空队列放 ...

随机推荐

  1. Spring Boot+Thymeleaf+MyBatis--推荐一个后端练手极佳的商城项目

    项目整体架构 newbee-mall ├── src/main/java └── ltd.newbee.mall ├── common // 存放相关的常量配置及枚举类 ├── config // 存 ...

  2. Redisson 框架中的分布式锁

    实现分布式锁通常有三种方式:数据库.Redis 和 Zookeeper.我们比较常用的是通过 Redis 和 Zookeeper 实现分布式锁.Redisson 框架中封装了通过 Redis 实现的分 ...

  3. 专访实在智能孙林君:颠覆传统RPA的实在IPA模式如何做到真正人人可用?

      王吉伟对话实在智能孙林君:颠覆传统引领RPA行业的实在IPA模式是如何炼成的? 王吉伟对话实在智能孙林君:为什么第一款颠覆行业的RPA诞生在实在智能? 专访实在智能孙林君:打造出真正人人可用的实在 ...

  4. 协议CAN&报文&仲裁

    简介 物理层 CAN 协议提供了 5 种帧格式来传输数据 数据链路层 中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID)  显性0,隐性1 ...

  5. nest.sh 脚本 发布服务

    每次发布后端nest 直接执行一个脚本即可 给脚本赋值权限 chomd 777 nest.sh nest.sh 脚本 #!/bin/bash cd /root/gateway-study git pu ...

  6. 基于ADS1299的可穿戴设备调试之接口含义简析

    前言    几个项目都用到了ADS1299,没想到中间会出那么多的问题.在解决问题的时候,这里面暴露了团队的不少不足之处.看来做技术,还是需要不断地积累.思维不能留盲点啊.要经常总结,做笔记.   接 ...

  7. apt-get install安装软件时出现依赖错误解决方案

    在使用apt-get install安装软件时,经常会遇到如上图所示错误,该错误的意思为缺少依赖软件,解决方案为: aptitude install golang-go

  8. 图像基础概念与YUV/RGB深入理解

    目录 一.图像基础概念 1.1 像素 1.2 分辨率 1.2 分辨率-不同分辨率之间的区别 1.3 位深 1.4 帧率 1.4 码率 二.YUV/RGB深入理解 2.1 RGB 2.2 YUV 2.2 ...

  9. Serverless学习笔记

    Serverless 闲言碎语 前段时间看了一些Serverless的文章,恰好最近又听了一门Serverless的应用实践课程,就把笔记拿出来和大家分享一下,如表述有误还请各位斧正 大家关心的问题 ...

  10. 使用Servlet实现文件下载

    一位朋友最近在学习JavaWeb开发,开始学习文件下载操作,他自己尝试着去网上看一些教程,总的来说也不是太了解,就让我和他说说,如何实现文件下载功能.我和他说了一下大致的思路,主要分为前端和后端两部分 ...