一、协程

二、异步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. 固态硬盘使用f2fs作为根分区安装linux

    目录 前言 碰到的问题 对策 我的实际操作步骤 0.警告 1. 准备 2. 分区 3. 使用网络安装debian10 4. 备份根分区 5. 修改固态硬盘linux根分区为f2fs 6.恢复备份 7. ...

  2. Nebula Graph 源码解读系列 | Vol.00 序言

    本文首发于 Nebula Graph Community 公众号 Nebula Graph 是由杭州欧若数网科技有限公司(官网:https://www.vesoft.com/cn/)开源的一款分布式图 ...

  3. Java package(包) +import 关键字(2)

    1 package com.bytezero.exer; 2 3 import java.lang.reflect.Field; 4 5 //import java.util.ArrayList; 6 ...

  4. C++ //count_if //按条件统计元素个数 //自定义和 内置

    1 //按条件统计元素个数 2 //count_if 3 4 #include <iostream> 5 #include<string> 6 #include<vect ...

  5. Linux操作系统加固建议

    1.1.1 口令锁定策略 1.执行备份 (1).redhat执行备份: #cp -p /etc/pam.d/system-auth /etc/pam.d/system-auth_bak (2).SUS ...

  6. BeanShell 如何加密加签?

    一 首先我们要搞清楚接口签名步骤: **第一步:初步实现接口****第二步:找开发拿到算法和key** * key:sAHDRNJg0ZevmEn7HwBfbw== * 算法:HmacMD5 咱们就找 ...

  7. Java面试必考题之线程的生命周期,结合源码,透彻讲解!

    写在开头 在前面的几篇博客里,我们学习了Java的多线程,包括线程的作用.创建方式.重要性等,那么今天我们就要正式踏入线程,去学习更加深层次的知识点了. 第一个需要学的就是线程的生命周期,也可以将之理 ...

  8. stm32 boot0硬件接法导致的概率性启动失败问题总结和反思

    概要  问题概要,板子在稳压电源上工作很好,可一旦接了电池,stm32就会出现概率性的无法启动.加上项目比较急,这个问题阻塞一直无法量产.真是非常的要命啊. 思路分析  既然是不同的电源会导致这个问题 ...

  9. C++ 派生类对象的构造与析构过程

    C++ 派生类对象的构造与析构过程 因为基类的成员变量和派生类的成员变量在内存中的连续的(下面程序会验证这一点),如下图所示: 所以构造派生类对象的时候,构造成员变量的过程就像入栈一样: 那么很自然, ...

  10. 记录--uni-app adb安卓wifi无线调试

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 方法一 adb connect连接调试 前提条件: 电脑已安装adb工具 手机和电脑连接的同一个WIFI CMD进入到adb工具所在目录, ...