前情回顾
1. 进程线程的区别和联系
   * 都是多任务编程
   * 一个进程包含多个线程
   * 都是动态的占有资源的,线程共享进程的资源
   * 进程比线程消耗资源更多
   * 进程空间独立使用特定的IPC,线程使用全局变量

2. 服务器模型
  
   循环模型 : 同一时刻只能处理一个请求


   并发模型 : IO 并发 : 多个IO任务
               多进程/多线程并发 : 任何任务
 
3. 基于fork的多进程并发程序
    每当有一个客户端连接就创建一个新的进程

4. ftp文件服务程序
***********************************************

多线程并发

threading 的多线程并发

对比多进程并发:
    * 消耗资源较少
    * 线程应该更注意共享资源的操作
    * 在python中应该注意GIL问题,网络延迟较高,线程并   发也是一种可行的办法

实现步骤
    1. 创建套接字,绑定监听
    2. 接收客户端请求,创建新的线程
    3. 主线程继续接收其他客户端连接
    4. 分支线程启动对应的函数处理客户端请求
    5. 当客户端断开,则分支线程结束

cookie

import traceback

traceback.print_exc()
功能 : 更详细的打印异常信息


集成模块的使用
python2 SocketServer
python3 socketserver

功能 : 通过模块的不同类的组合完成多进程/多线程 的           tcp/udp的并发

StreamRequestHandler  处理tcp套接字请求
DatagramRequestHandler  处理udp套接字请求

TCPServer  创建tcp server
UDPServer  创建udp server

ForkingMixIn   创建多进程
ForkingTCPServer -->  ForkingMinIn + TCPServer
ForkingUDPServer -->  ForkingMinIn + UDPServer

ThreadingMixIn  创建多线程
ThreadingTCPServer --> ThreadingMinIn + TCPServer
ThreadingUDPServer --> ThreadingMinIn + UDPServer
 

HTTPServer  V2.0

1. 接收客户端请求
2. 解析客户端请求
3. 组织数据,形成HTTP response
4. 将数据发送给客户端

升级
1. 采用多线程并发接收多个客户端请求
2. 基本的请求解析,根据请求返回相应的内容
3. 除了可以请求静态网页,也可以请求简单的数据
4. 将功能封装在一个类中

技术点 :
1. socket  tcp 套接字
2. http协议的请求响应格式
3. 线程并发的创建方法
4. 类的基本使用


协程基础

定义 : 纤程,微线程。协程的本质是一个单线程程序,所以协程不能够使用计算机多核资源。

作用 : 能够高效的完成并发任务, 占用较少的资源。因         此协程的并发量较高


原理 : 通过记录应用层的上下文栈区,实现在运行中进行上下文跳转,达到可以选择性地运行想要运行的部分,以此提高程序的运行效率。


优点 : 消耗资源少
        无需切换开销
 无需同步互斥
 IO并发性好

缺点 : 无法利用计算机多核

yield ---》 协程实现的基本关键字


greenlet

greenlet.greenlet()  生成协程对象
gr.switch() 选择要执行的协程事件

gevent

1. 将协程事件封装为函数
2. 生成协程对象
  gevent.spawn(func,argv)
  功能 : 生成协程对象
  参数 : func  协程函数
          argv  给协程函数传参
  返回值 : 返回协程对象

3.回收协程
  gevent.joinall()
  功能 : 回收协程
  参数: 列表 将要回收的协程放入列表

 gevent.sleep(n)
 功能: 设置协程阻塞,让协程跳转
 参数: n  阻塞时间

from gevent import monkey
monkey.patch_all()
功能: 修改套接字的IO阻塞行为

* 必须在socket导入之前使用