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

原文地址:https://www.cnblogs.com/sky-ai/p/9847781.html

时间: 2024-10-12 07:50:11

pythonNet 09协程的相关文章

python协程函数、递归、匿名函数与内置函数使用、模块与包

目录: 协程函数(yield生成器用法二) 面向过程编程 递归 匿名函数与内置函数的使用 模块 包 常用标准模块之re(正则表达式) 一.协程函数(yield生成器用法二) 1.生成器的语句形式 a.生成器相关python函数.装饰器.迭代器.生成器,我们是如何使用生成器的.一个生成器能暂停执行并返回一个中间的结果这就是 yield 语句的功能 : 返回一个中间值给调用者并暂停执行. 我们的调用方式为yeild 1的方式,此方式又称为生成器的语句形式. 而使用生成器的场景:使用生成器最好的场景就

python 线程,进程与协程

引言 线程 创建普通多线程 线程锁 互斥锁 信号量 事件 条件锁 定时器 全局解释器锁 队列 Queue:先进先出队列 LifoQueue:后进先出队列 PriorityQueue:优先级队列 deque:双向队列 引言 在学习过socket和socketserver后,我们了解到socketserver可以支持IO多路复用.在定义socketserver服务端的时候一般会使用: server = socketserver.ThreadingTCPServer(settings.IP_PORT,

FreeRTOS基础以及UIP之协程--C语言剑走偏锋

在FreeRTOS中和UIP中,都使用到了一种C语言实现的多任务计数,专业的定义叫做协程(coroutine),顾名思义,这是一种协作的例程, 跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程技巧. 意思就是说协程不需要每次调用的时候都为任务准备一次空间,我们知道像ucos这种操作系统,它内置的多任务是需要在中断过程中切换堆栈的,开销较大,而协程的功能就是在尽量降低开销的情况下,实现能够保存函数上下文快速切换的办法,用操作系统的概念来说,一千个

Python_进程、线程及协程

一.Python进程 IO密集型----多线程 计算密集型----多进程 1.单进程 from multiprocessing import Process def foo(i): print('你好哈',i) if __name__ == '__main__': #if __name__ == '__main__':只可做测试调用,不能用于生产,windows不支持,linux中可不用添加if __name__ == '__main__' for i in range(10): t = Pro

[转载]协程-cooperative multitasking

[转载]协程三讲 http://ravenw.com/blog/2011/08/24/coroutine-part-1-defination-and-classification-of-coroutine/ http://ravenw.com/blog/2011/09/01/coroutine-part-2-the-use-of-coroutines/ http://ravenw.com/blog/2011/09/06/coroutine-part-3-coroutine-and-continu

Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型

使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为文末的链接,以及自己的补充理解. 完整代码 1 #!/usr/bin/python 2 # ============================================================= 3 # File Name: async_base.py 4 # Author: L

15.python并发编程(线程--进程--协程)

一.进程:1.定义:进程最小的资源单位,本质就是一个程序在一个数据集上的一次动态执行(运行)的过程2.组成:进程一般由程序,数据集,进程控制三部分组成:(1)程序:用来描述进程要完成哪些功能以及如何完成(2)数据集:是程序在执行过程中所需要使用的一切资源(3)进程控制块:用来记录进程外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志.3.进程的作用:是想完成多任务并发,进程之间的内存地址是相互独立的二.线程:1.定义:最小的执行单位,线程的出现是为了

关于Unity协程(Coroutine)

协程官方doc解释A coroutine is a function that can suspend its execution(yield) until the given given YieldInstruction finishes. StartCoroutine开启协程 先执行协程中的代码 碰到yield return时控制权交给unity引擎 引擎继续做接下来的工作例如第一次yield return之后执行StartCoroutine下一行代码 直到满足yield指令的要求才会重新进

Gevent的socket协程安全性分析

一般讨论socket的并发安全性,都是指线程的安全性...而且绝大多数的情况下socket都不是线程安全的.. 当然一些框架可能会对socket进行一层封装,让其成为线程安全的...例如java的netty框架就是如此,将socket封装成channel,然后让channel封闭到一个线程中,那么这个channel的所有的读写都在它所在的线程中串行的进行,那么自然也就是线程安全的了..... 其实很早看Gevent的源码的时候,就已经看过这部分的东西了,当时就已经知道gevent的socket不