学习笔记(35):Python网络编程并发编程-协程(yield,greenlet,gevent模块)

立即学习:https://edu.csdn.net/course/play/24458/296457?utm_source=blogtoedu

协程(yield,greenlet,gevent)

 

1.协程:在单线程中通过不断地在多个任务之间进行切换执行,来达到并发的效果的线程,可以提高效率

 

2.yield实现协程

#yield = return + generator(生成器)
#有yield的函数就是生成器,不会直接执行函数,首先获得生成器对象然后使用next函数这才开始运行函数
#next方法#并发执行
import time
def productor():g = costumor()for i in range(100):res = next(g)print(res)def costumor():for i in range(100):res = yield "*"*5+"%s"%i+'*'*5if __name__ == '__main__':start_time = time.time()productor()end_time = time.time()print('%.9f'%float(end_time-start_time))#串行
def productor():res = costumor()for i in res:print('*'*5+str(i)+"*"*5)def costumor():res=[]for i in range(100):res.append(i)return resif __name__ == '__main__':start_time = time.time()productor()end_time = time.time()print('%.9f'%float(end_time-start_time))

 

3.greenlet实现协程

#greenlet也是i一个可以实现单线程内并发的效果,但是和yield一样不能检测i/o模型
#切换的格式为:
'''
g1 = greenlet(function1)#获得对象
g2.switch(para)#从当前任务切换到g2对应的任务中
'''
#协程并发
from greenlet import greenlet#定义函数一
def eat(name):print('%s1 is eating'%name)g2.switch('同学')print('%s2 is eating'%name)g2.switch()#定义函数2
def play(name):print('%s1 is playing'%name)g1.switch()print('%s2 is playing'%name)if __name__ == '__main__':g1 = greenlet(eat)g2 = greenlet(play)g1.switch('同学')

 

4.gevent实现协程


#1.gevent模块是基于greenlet模块的,具有检测自身I/O操作的功能
import gevent,time#定义任务1
def eat(name):print('%s eat 1'%name)#自身的I/O操作。可以被检测出,一旦检测出就自动进行任务·切换gevent.sleep(3)print('%s eat 2'%name)#定义任务2
def play(name):print('%s play 1'%name)gevent.sleep(4)print('%s play 2'%name)start_time = time.time()
#创建gevent对象,只是提交了任务,要想出结果,必须跟join函数配对使用
g1 = gevent.spawn(eat,'john')
g2 = gevent.spawn(play,'lucy')g1.join()
g2.join()
end_time = time.time()
print(end_time-start_time)
'''
运行结果:
john eat 1
lucy play 1
john eat 2
lucy play 2
4.0197389125823975#运行时间接近4秒,即两个任务并发执行的#首先该程序是单线程,只有一个主线程,但是含有两个任务,首先按照代码从上到下执行,
执行到创建对象时,会自动跳转到对应的函数中去,如g1跳到eat函数,执行第一次打印,
检测到自身gevent.sleep()I/O操作后,就自动切换到下一个任务,执行play函数的第一次
打印,后面就是两个任务均处于等待状态,期间一直在两个任务之间切换进行检测,因为eat时间短,
所以先执行eat函数的第二次打印任务,接着就是Play的第二次打印#因此这里实现了单线程两个任务并发的效果
'''#2.gevent模块是基于greenlet模块的,具有检测自身I/O操作的功能,不能检测自身以外的I/O操作,如time.sleep()
import gevent,time#定义任务1
def eat(name):print('%s eat 1'%name)#自身的I/O操作。可以被检测出,一旦检测出就自动进行任务·切换time.sleep(3)print('%s eat 2'%name)#定义任务2
def play(name):print('%s play 1'%name)time.sleep(4)print('%s play 2'%name)start_time = time.time()
#创建gevent对象,只是异步提交了任务,不会等结果的出来,要想出结果,必须跟join函数或者和joinall()配对使用,
g1 = gevent.spawn(eat,'john')
g2 = gevent.spawn(play,'lucy')g1.join()
g2.join()
#gevent.joinall([g1,g2])
end_time = time.time()
print(end_time-start_time)
'''
john eat 1
john eat 2
lucy play 1
lucy play 2
7.019653797149658
#运行时间接近与两个任务I/O操作的时间总和,因此gevent不能检测出自身以为的I/O操作
'''#3.gevent.monkey.patch_all():可以检测到自身以外的I/O操作
import gevent,time
from gevent import monkey
monkey.patch_all()#定义任务1
def eat(name):print('%s eat 1'%name)#自身的I/O操作。可以被检测出,一旦检测出就自动进行任务·切换time.sleep(3)print('%s eat 2'%name)#定义任务2
def play(name):print('%s play 1'%name)time.sleep(4)print('%s play 2'%name)start_time = time.time()
#创建gevent对象,只是提交了任务,要想出结果,必须跟join函数配对使用
g1 = gevent.spawn(eat,'john')
g2 = gevent.spawn(play,'lucy')g1.join()
g2.join()
end_time = time.time()
print(end_time-start_time)
'''
john eat 1
lucy play 1
john eat 2
lucy play 2
4.009758949279785#说明检测到了time.sleep()的I/O操作,自动进行切换,实现了单线程并发的效果
'''

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双目标定算法

坐标系基础知识: > 1.1. 从像素坐标系(u,v) 到 世界坐标系(Xw,Yw,Yw) 这里直接拿上篇博文的结果,中间省去了其它坐标系直接的关系,直接给出,如下所示: 公式如下: > 1.2. 符号规定( Notation ) 为了…

Spring bean三种创建方式

spring共提供了三种实例化bean的方式:构造器实例化(全类名,反射)、工厂方法(静态工厂实例化 动态工厂实例化)和FactoryBean ,下面一一详解: 1、构造器实例化 City.java 1 package com.proc.bean;2 3 publ…

Excel使用控件创建动态地图图表

[本文软件Excel 2010] 效果图: 首先我们看一下数据源 数据源中第二列是对应图形的名称。首先创建图形,我们可能在网络中找到各个地图的矢量图形。不过不是每个地图图形都适合我们,或许企业划分非按照行政区划分。因此可以尝试自己绘制&#x…

Windows 10 常用的快捷键及常用指令

系统快捷键 快捷键功能说明备注CtrlShiftEsc打开任务管理器macbook: fnshiftF11普通键盘: PrintScreen截屏幕图macbook: fnshiftoptionF11普通键盘: altPrintScreen截取当前窗口图片macbook: WinfnEsc普通键盘: WinPause/Break打开系统属性WinctrlD新建虚拟桌面Windows 10Winct…

学习笔记(35续):Python网络编程并发编程-基于gevent及线程池实现的并发套接字通讯

1.基于线程池实现并发套接字通讯:因为套接字涉及地是I/O密集模型,因此使用多线程会有高效率 服务器 #基于线程池完成并发的套接字通讯 from socket import * from threading import Thread from concurrent.futures import ThreadPoolExecutordef commun…

使用Configuration Manager部署及管理软件更新(2)

承接上一篇文章:http://ericxuting.blog.51cto.com/8995534/1543835 一、 确定软件更新符合性 1. 打开Configuration Manager管理控制台,点击软件库,展开软件更新,点击所有软件更新 2. 点击主页中的运行摘要,等待对话框…

NULL、nil、Nil、NSNull的区别

标志值含义NULL(void *)0C指针的字面零值nil(id)0Objecve-C对象的字面零值Nil(Class)0Objecve-C类的字面零值NSNull[NSNull null]用来表示零值的单独的对象转载于:https://www.cnblogs.com/wlsxmhz/p/56250…

Fiddler 域名过滤

原来一直没意识到Fiddler过滤,导致每次抓包都要自己判断、搜索好多东西,真是呵呵! 过滤设置很简单,看懂一张图就解决问题了。 箭头 那两处设置下,圆圈处保存再进行抓包即可 转载于:https://www.cnblogs.com/eejron/p/4…

windows中VS卸载opencv配置,重新安装其他版本

1、找到工程的属性管理器,电机Debug64和Release64下面的 包含目录和库目录,删掉其原由配置的oepncv路径; 找到链接器中的附加依赖项,删掉原有的配置;

学习笔记(36):Python网络编程并发编程-IO模型介绍

立即学习:https://edu.csdn.net/course/play/24458/296460?utm_sourceblogtoedu I/O模型介绍:I/O模型表示处于等待状态的模型,如套接字通讯的accept和recv函数一样 1.同步I/O 2.异步I/O 3.阻塞I/O 4.非阻塞I/O

AD9 如何画4层pcb板

新建的PCB文件默认的是2层板,教你怎么设置4层甚至更多层板。在工具栏点击Design-->Layer Stack Manager.进入之后显示的是两层板,添加为4层板,一般是先点top layer, 再点Add Layer,再点Add Layer,这样就成了4层板。见下图。 有…

gulp 流处理

包含的内容: 穿插流流合并流队列流筛选1. 穿插流// passthrough stream 把流传递给其他的// usegulp.src(glob,{passthrough:true})// function 进行流的合并处理,避免多余配置以及冗余代码 2. 合并流// 使用merge2// install yarn add merge2 or …

windows上使用cmake 编译yaml-cpp源码,生成yam-cpp.lib

1、打开cmake-gui 2、添加CmakeList 3、建立build 4、进入工程中生成debug和release版本的lib

BZOJ 3039: 玉蟾宫( 悬线法 )

最大子矩阵...悬线法..时间复杂度O(nm)悬线法就是记录一个H向上延伸的最大长度(悬线), L, R向左向右延伸的最大长度, 然后通过递推来得到. ------------------------------------------------------------------#include<bits/stdc.h>using namespace std;#define ok(c) …

学习笔记(37):Python实战编程-yield实现生成器

立即学习:https://edu.csdn.net/course/play/19711/255579?utm_sourceblogtoedu1.yield return generator yield是一个返回的是一个生成器对象&#xff0c;是通过next函数一次一次地进行函数地迭代来获取结果的&#xff0c;而return函数则是将结果返回后&#xff0c;不再与…

ie6、7 下input的边框问题 ?

input的border设置为none,ie8及以上border都兼容&#xff0c;ie6和7的border还继续存在&#xff0c;将border设为0时所有浏览器上都不存在了&#xff0c;但是border为0时还是会继续的渲染。 将input的border设为"0 none",ie7及以上都正常了&#xff0c;但是ie6上inpu…

Mocha BSM产品亮点——关联事件分析

业务需求与挑战企业经常会遇到下列场景&#xff1a;• 企业某应用&#xff0c;例如&#xff0c;WebSphere Portal Server&#xff0c;已经不可用&#xff0c;是由于应用自身已不可用&#xff1f;还是应用所连接的数据库出了问题&#xff1f;还是应用的LDAP服务不可用&#xff1…

轻量级文本编辑器,Notepad最佳替代品:Notepad++

目录 正文之前1. 目的2. 原帖3. 为何推荐Notepad3.1. Notepad的一些基本特点3.2. notepad&#xff0c;notepad2&#xff0c;notepad&#xff0c;ultraEdit比较4. 使用Notepad前要了解的知识4.1. Notepad的名称和缩写4.2. Notepad修改设置后&#xff0c;立即生效4.3. Notepad的版…

学习笔记(38):Python实战编程-窗体显示

立即学习:https://edu.csdn.net/course/play/19711/343100?utm_sourceblogtoedu GUI&#xff1a;图形用户接口——GUI组件&#xff0c;组件定义&#xff0c;组件布局管理 主体窗口的设置&#xff1a; import tkinter#导入创建窗体的相关模块class Mainwindow():#创建窗口类de…

Tomcat 配置和spring-framework MVC配置简介

Tomcat启动时&#xff0c;先找系统变量CATALINA_BASE&#xff0c;如果没有&#xff0c;则找CATALINA_HOME。然后找这个变量所指的目录下的conf文件夹&#xff0c;从中读取配置文件。最重要的配置文件&#xff1a;server.xml 。要配置tomcat&#xff0c;基本上了解server.xml&am…