一、协程

二、异步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. 二十一: Mysql 锁机制

    Mysql 锁机制 事务的 隔离性 由这章讲述的 锁 来实现. 1. 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤 ...

  2. C++//queue 队列 容器 先进先出 只有队头 队尾能被外界访问 因此不允许有遍历行为

    1 //queue 队列 容器 先进先出 只有队头 队尾能被外界访问 因此不允许有遍历行为 2 3 4 #include<iostream> 5 #include<queue> ...

  3. linux的内置crontab(定时任务)的简单介绍

    编写定时任务的基本命令: #查看当前用户的crontab crontab -l:   #编辑crontab任务 crontab -e:   #删除crontab任务 crontab -r   定时任务 ...

  4. MYSQL索引-上

    前言 今天同事做数据清理的时候发现我这边有一张表没有主键,这个表有两个字段,ID和Name,ID作者唯一索引,在我印象里,一个数据表如果没有主键索引,它会内部创建主键索引,创建的标准就是唯一性,我觉得 ...

  5. Java加密技术(五)——非对称加密算法的由来DH

    Java非对称加密算法dh     接下来我们分析DH加密算法,一种适基于密钥一致协议的加密算法. DH Diffie-Hellman算法(D-H算法),密钥一致协议.是由公开密钥密码体制的奠基人Di ...

  6. epoll反应堆理解

    https://www.aliyundrive.com/s/oBvP7BcjsCS https://blog.csdn.net/weixin_36750623/article/details/8354 ...

  7. 大年学习linux(第二节---磁盘管理)

    二.磁盘管理 文件系统配置文件 /etc/filesystems: 系统指定的测试挂载文件系统类型 /proc/filesystems: linux 系统已经加载的文件系统类型 /lib/module ...

  8. Lifecycle详细分析

    Lifecycle源码分析 目录介绍 01.Lifecycle的作用是什么 02.Lifecycle的简单使用 03.Lifecycle的使用场景 04.如何实现生命周期感知 05.注解方法如何被调用 ...

  9. Button按钮Effect的用法

    教大家写一个好看的Button按钮 代码简单粗暴 <Grid > <Border Width="200" Height="30" Margin ...

  10. KingbaseES Collate排序规则对结果集的影响

    背景 前端在客户现场遇到一个问题,模糊查询报错:error:invalid multibyte charactor for locale pg the server LC_TYPE locale is ...