zoukankan      html  css  js  c++  java
  • pythonNet 09协程

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

  • 相关阅读:
    开源一个常用的小软件的源码——系统数据库服务管理软件
    MySql Windws 下自动备份脚本
    ubuntu-14.04-server配置Jexus --安装步骤记录
    Jumony快速抓取网页 --- Jumony使用笔记--icode
    视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
    收录.NET跨平台及跨数据库的博文...
    ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
    Windbg程序调试系列
    QCY蓝牙耳机 左右两只耳机配对 方法
    wpf 的 Window或UserControl绑定自己后台属性
  • 原文地址:https://www.cnblogs.com/sky-ai/p/9847781.html
Copyright © 2011-2022 走看看