1.提交任务得方式:
同步:提交完任务,等结果,执行下一个任务
异步:提交完,接着执行,异步 + 回调 异步不等结果,提交完任务,任务执行完后,会自动触发回调函数
2.同步不等于阻塞:
阻塞:遇到io,自己不处理,os会抢走cpu ,解决办法:监测到io,gevent切换到其他任务,类似欺骗os
非阻塞:cpu 运行
3.IO分类:
1.阻塞IO blocking IO
2.非阻塞IO nonblocking IO
3.IO多路复用 IO multiplexing
4.信号驱动IO signal driven IO 用得比较少
5.异步IO asynchronous IO
4.network io
涉及到两个系统对象:
1.调用这个io的进程(process/thread)
2.系统内核(kernel)
操作涉及到两个阶段:
1.等待数据准备
2.将数据从内核拷贝到进程中
5.阻塞io:
blocking IO的特点:
在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了.
socket编程:
几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的.
解决方案:
多线程/线程池,可以解决小规模的服务请求;面对大规模的服务请求,多线程模型也会遇到瓶颈,用非阻塞接口来解决.
1 from socket import * 2 from threading import Thread 3 4 def communicate(conn): 5 while True: 6 try: 7 data = conn.recv(1024) 8 if not data: break 9 conn.send(data.upper()) 10 except ConnectionResetError: 11 break 12 13 conn.close() 14 15 server = socket(AF_INET, SOCK_STREAM) 16 server.bind(('127.0.0.1',8080)) 17 server.listen(5) 18 19 while True: 20 print('starting...') 21 conn, addr = server.accept() # io 阻塞 os拿走了cpu 22 print(addr) 23 24 t=Thread(target=communicate,args=(conn,)) 25 t.start() 26 27 server.close()