Skr-Eric的网络编程课堂(十一)-- 多线程并发和协程

多线程并发

 

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导入之前使用

 

 

 

 

 

想要看更多的课程请微信关注SkrEric的编程课堂

你可能感兴趣的:(多线程并发,协程)