目录

  • 一、什么是协程
  • 二、为什么要有协程
  • 三、协程的优缺点
  • 四、如何实现协程
  • 五、Gevent模块
    • 5.1 模块的安装
    • 5.2 用法介绍
    • 5.3 代码实例
  • 六、gevent之应用

一、什么是协程

协程: 就是单线程实现并发

协程概念本质是程序员抽象出来的,是人为的控制通过程序的IO去进行切换任务的执行

并发:任务切换+保存状态

二、为什么要有协程

自己控制切换要比操作系统切换快的多.降低了单个线程的io堵塞时间,也就是实现了单线程下效率最高.

三、协程的优缺点

  • 优点:

    自己控制切换要比操作系统切换快的多

  • 缺点:

    1. 需要自己要检测所有的io,但凡有一个阻塞整体都跟着阻塞.
    2. 无法利用多核优势.

四、如何实现协程

其实协程的本质就是在单线程下实现并发,也就是通过生成器yieldnext进行迭代生成器,实现切换任务和保存任务。

在Python中我们需要使用gevnet模块来实现协程

五、Gevent模块

Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet,它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。

5.1 模块的安装

安装:pip3 install gevent

5.2 用法介绍

g1=gevent.spawn(func,1,,2,3,x=4,y=5):创建一个协程对象g1,spawn括号内第一个参数是函数名,如eat,后面可以有多个参数,可以是位置实参或关键字实参,都是传给函数eat的

g2=gevent.spawn(func2)

g1.join():等待g1结束

g2.join():等待g2结束

上述两步合作一步:gevent.joinall([g1,g2])

g1.value:拿到func1的返回值

5.3 代码实例

通过from gevent import monkey;

monkey.patch_all()去补丁,捕获所以IO

from gevent import monkey;monkey.patch_all()必须放到被打补丁者的前面,如time,socket模块之前。

import time
from gevent import monkey;monkey.patch_all()
'''打了一个补丁,它可以实现捕获非gevent的所有io'''
import geventdef eat():print('eat 1')time.sleep(2)# gevent.sleep(2)   # 可以这样单独捕捉阻塞,但是太麻烦,所以直接打补丁,捕捉运行期间的全部IOprint('eat 2')
def play():print('play 1')# 疯狂的计算呢没有iotime.sleep(3)# gevent.sleep(3)   # 可以这样单独捕捉阻塞,但是太麻烦,所以直接打补丁,捕捉运行期间的全部IOprint('play 2')'''
gevent实现协程的模块,它可以捕获单线程中的io并去切换任务
'''
if __name__ == '__main__':# 把本该串行的代码通过协程完成单线程并行start = time.time()g1 = gevent.spawn(eat)      # 创建一个协程对象g2 = gevent.spawn(play)# g1.join() # 等待回收协程对象# g2.join()gevent.joinall([g1,g2])     # 把上面两步并一步end = time.time()print(end-start)

六、gevent之应用

通过gevent实现单线程下的socket并发

注意:from gevent import monkey;monkey.patch_all()一定要放到导入socket模块之前,否则gevent无法识别socket的阻塞。

服务器

import socket
from gevent import monkey; monkey.patch_all()   # 打补丁
import gevent'''
基于协程的socket通讯协程:单线程下实现并发
'''def connec_interface(conn,addr):while 1:try:data = conn.recv(1024)if not data:breakprint(f"来自{addr}的消息:",data.decode("utf8"))data = input(f"与{addr}聊天")conn.send(data.encode("utf8"))except:breakif __name__ == '__main__':server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)server.bind(("127.0.0.1",8080))server.listen(5)while 1:print("等待连接。。。")conn,addr = server.accept()print("连接成功")gevent.spawn(connec_interface, conn, addr)  # 创建一个协程对象

客户端

import socketclient = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",8080))while 1:msg = input("请输入内容")client.send(msg.encode("utf8"))data = client.recv(1024)if not data:breakprint(data.decode("utf8"))

转载于:https://www.cnblogs.com/XuChengNotes/p/11553360.html

123 Python程序中的线程操作-协程相关推荐

  1. Python程序中的线程操作-锁

    目录 一.同步锁 1.1 多个线程抢占资源的情况 1.1.1 对公共数据的操作 1.2 同步锁的引用 1.3 互斥锁与join的区别 二.死锁与递归锁 2.1 死锁 2.2 递归锁RLock 三.典型 ...

  2. 在python程序中的进程操作

    ********在python程序中的进程操作********之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了, 运行中的程序就是一个进程.所有的进程都是通过 ...

  3. python在中小学教学中的应用-在python程序中的进程操作

    ********在python程序中的进程操作********之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了, 运行中的程序就是一个进程.所有的进程都是通过 ...

  4. python提高——进程、线程、协程对比及代码实现

    目录 1多任务 1.1并发 1.2并行 2线程 2.1引入线程 2.2线程进行顺序 2.3线程封装 2.4多线程-共享全局变量 2.5资源竞争 2.6互斥锁 2.7死锁 3进程 3.1进程创建 3.2 ...

  5. python 基础 进程,线程,协程,并发并行,异步同步的定义

    进程,线程,协程 进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. ​ 用大白话说就是系统执行某一项过程的行为,比如你用浏览器在线播放器 ...

  6. python进程线程处理模块_python程序中的线程操作 concurrent模块使用详解

    一.concurrent模块的介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecut ...

  7. python多线程为什么要用队列_Python程序中的线程操作-线程队列

    一.线程队列 queue队列:使用import queue,用法与进程Queue一样 queue is especially useful in threaded programming when i ...

  8. python 协程、进程、线程_Python 中的进程、线程、协程

    1. 进程 进程是正在运行的程序实例,是内核分配资源的最基本的单元.进程拥有自己独立的堆和栈,独立的地址空间,资源句柄.进程由 OS 调度,调度开销较大,在并发的切换过程效率较低. Python 提供 ...

  9. python启动多个进程_Python程序中的进程操作--—--开启多进程

    Python程序中的进程操作-----开启多进程 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创 ...

  10. python协程和线程区别_python中的线程和协程之间有什么区别

    一.首先我们来了解一下线程和协程的概念1.线程线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源( ...

最新文章

  1. 名头不小!!VMware vSphere实为VI升级版。
  2. JavaScript 中的对象拷贝(深拷贝、浅拷贝)
  3. 13分钟,教你python可视化分析20W数据,找到妹子最爱的内衣
  4. 服务器虚拟化十大因素
  5. [sdoi2015]排序(搜索+剪枝优化)
  6. 已知两点坐标,求两点连成的直线中的某一点坐标
  7. 状态机编程 (一) 状态机相关概念
  8. android 图片轮播框架banner
  9. 单层感知器为什么不能解决异或(XOR)问题
  10. 纸壳CMS(ZKEACMS)体验升级,快速创建页面,直接在页面中修改内容
  11. 如何在AppSec测试中处理SAST FPs
  12. Redis基本数据类型和使用场景
  13. 实现图书馆检索图书功能
  14. USCD行人异常数据集使用指南 | 快速下载
  15. java 循环new对象_java中new一个对象放在循环体里面与外面的区别
  16. 局域网访问提示无法访问检查拼写_win10无法访问局域网电脑 请检查名称的拼写...
  17. ffmpeg利用滤镜合并两个视频,一左一右---avfilter_link实现
  18. 利率风险结构和期限结构
  19. 用安卓手机看epub电子书用什么阅读软件好?
  20. FPGA之FIFO详解,读写位宽不同

热门文章

  1. 基于springboot+vue的大学生健康档案管理系统
  2. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_25-页面查询接口测试-Swagger...
  3. 阶段3 3.SpringMVC·_03.SpringMVC常用注解_4 HiddentHttpMethodFilter过滤器
  4. 阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
  5. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_11_Thread类的常用方法_sleep...
  6. 超市商品购买与管理系统
  7. 【转】解决“你没有权限访问,请与网络管理员联系”
  8. 《出发吧一起》第二阶段个人总结——Day08
  9. mysql 日期时间运算函数(转)
  10. Can't add self as subview crash错误