第十篇:异步IO、消息队列

1、协程python

2、异步IO_Gevent数据库

3、协程异步IO操做编程

4、事件驱动模型windows

5、IO多路复用多线程

6、异步IO理论app

 

 

1、回顾
线程 vs 进程
线程:CPU最小调度单位,内存共享;
线程同时修改同一份数据是必须加锁,mutex互斥锁
递归锁
join 等待线程执行结果;
进程:资源集合

2、多进程
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() #子进程
每一个进程都是由父进程启动;socket

3、进程Queue数据传递
form multiprocessing import Process, Queue
子线程的queue能访问父线程的queue,内存共享;
子进程的queue不能访问父进程的queue,内存独立;
子进程要访问父进程的queue,必须传入进程queue;
至关于克隆一份queue给子进程;pickle过程;
4、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() #子进程里发数据async

进程数据共享:
with Manager() as manager:
d=manager.dict() #生成一个字典,可在多个进程间共享和传递;
l=manager.list() #生成一个列表,可在多个进程间共享和传递;函数

5、进程锁
from multiprocession import Lock
lock = Lock()
lock.acquire()
lock.release()
进程锁存在的意义,屏幕打印;
6、进程池
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 回调函数;前面函数执行完后执行回调函数;
回调函数是主进程调用,主进程链接数据库长链接;

7、协程
协程就是一种用户态的轻量级线程;
遇到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操做;

8、事件驱动模型 检测到事件,放入事件队列,调用各自的函数处理事件; 事件驱动是一种编程范式;9、IO多路复用 1.等待数据准备 2.将数据从内核空间拷贝到进程中; 阻塞I/O,等待数据和拷贝数据都阻塞 非阻塞,等待数据时非阻塞,特色是用户须要不断得询问内核数据有没有准备好; I/O多路复用,select,poll,epoll 异步I/O, epoll没有最大链接数的限制; asyncio 异步IO10、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()