协程,IO模式

1、协程(别人的模块,达到单线程并发效果)

程序的运行状态:

阻塞:

IO阻塞

非阻塞:

运行

就绪

单线程实现并发:

在应用程序里控制多个任务的切换+保存状态

可以把IO减下来,但是不可能降到无

优点:

应用程序级别速度要远远高于操作系统的切换

缺点:

多个任务一旦有一个阻塞没有切,整个县城都堵塞在原地

该线程内的其他的任务都不能执行

 

一旦引入协程,就需要检测单线程下素有的IO行为,

实现遇到IO就切换,少一个都不行,因为一旦一个任务阻塞,整个线程就 阻塞,其他的任务即便是可以计算,但是也无法运行。

2、用协程的目的

想要在单线程下实现并发

并发指的是多个任务看起来是同时运行的

并发=切换+保存状态

线程在进程内,进程在操作系统内,一切由操作系统控制

 

自己设置python程序让线程形成切换,不用操作系统控制。

协程只有单线程下遇到IO切换才会提成效率,操作系统相对与协程要更慢点

 

import timedef func1():for i in range(1000000):i+1
def func2():for i in range(1000000):i+1
start = time.time()
func1()
func2()
stop=time.time()
print(stop-start)# 基于yield并发
import time
def func1():while True:print("func1")yield
def func2():g=func1()for i in range(1000000):print("func2")i+1time.sleep(3)next(g)start=time.time()
func2()
stop=time.time()
print(stop-start)
串行执行:

 

from gevent import monkey,spawn;monkey.patch_all()#monkey.patch_all()补丁
import timedef eat(name):print("%s eat 1" %name)time.sleep(3)print("%s eat 2" %name)
def play(name):print("%s play 1" %name)time.sleep(1)print("%s play 2" %name)start=time.time()
g1=spawn(eat,"yf")#自动运行任务 模块
g2=spawn(play,"fxc")g1.join()#通过补丁让join识别其他IO
g2.join()
print(time.time() - start)
print(g1)
print(g2)from gevent import monkey,spawn;monkey.patch_all()
from threading import current_thread
import timedef eat(name):print("%s eat 1" %current_thread().name)#都是一个线程,前面有dummy假标明time.sleep(3)print("%s eat 2" %current_thread().name)
def play(name):print("%s play 1" %current_thread().name)time.sleep(1)print("%s play 2" %current_thread().name)start=time.time()
g1=spawn(eat,"yf")
g2=spawn(play,"fxc")g1.join()
g2.join()
print(time.time() - start)
print(g1)
print(g2)
与yield类似可以直接计算的 gevent

并发的套接字通信:

from gevent import spawn,monkey;monkey.patch_all()
from socket import *
from threading import Threaddef talk(conn):while True:try:data = conn.recv(1024)if len(data)==0:breakconn.send(data.upper())except ConnectionResetError:breakconn.close()def server(ip,port,backlog=5):server = socket(AF_INET,SOCK_STREAM)server.bind((ip,port))server.listen(backlog)print("starting..")while True:conn,addr=server.accept()spawn(talk,conn)
if __name__ == '__main__':g=spawn(server,"127.0.0.1",8080)g.join()
服务器:
from threading import Thread,current_thread
from socket import *def task():client = socket(AF_INET,SOCK_STREAM)client.connect(("127.0.0.1",8080))while True:msg="%s say hello" %current_thread().nameclient.send(msg.encode("utf-8"))data=client.recv(1024)print(data.decode("utf-8"))if __name__ == '__main__':for i in range(500):t=Thread(target=task)t.start()
客户端:

网络IO:

    recvfrom:#等待客户链接请求

        wait data:等待客户端产生数据——》客户端OS--》网络--》服务端操作系统缓存

        copy data:由本地操作系统缓存中的数据拷贝到应用程序的内存中

 

    send:

        copy data

conn.recv(1024) ==>OS

from socket import *
import timeserver = socket()
server.bind(("127.0.0.1",8080))
server.listen(5)
server.setblocking(False)#是否有链接过来

conn_l=[]
while True:try:print("总连接数[%s]" %len(conn_l))conn,addr=server.accept()conn_l.append(conn)except BlockingIOError:del_l=[]for conn in conn_l:try:data=conn.recv(1024)if len(data)==0:del_l.append(conn)continueconn.send(data.upper())except BlockingIOError:passexcept ConnectionResetError:del_l.append(conn)for conn in del_l:conn_l.remove(conn)
服务端:
from socket import *
import osclient=socket(AF_INET,SOCK_STREAM)
client.connect(("127.0.0.1",8080))
while True:msg="%s say hello" %os.getpid()client.send(msg.encode("utf-8"))data=client.recv(1024)print(data.dacoda("utf-8"))
客户端:

 

转载于:https://www.cnblogs.com/yf18767106368/p/9325944.html

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

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

相关文章

php中mysql和mysqli_php mysqli中-和::有什么区别?

->用来访问实例的成员,一般左面是一个类实例(或者$this), 右面是一个函数或者属性. 箭头也可以通过类实例来访问静态函数.::用来访问静态成员、常量,访问父类中的成员. 一般左面是一个类名,或self、parent、static关键字, 右面是一个静态函…

全国计算机等级考试题库二级C操作题100套(第05套)

第05套: 给定程序中,函数fun的功能是将参数给定的字符串、整数、浮点数写到文本 文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoi和atof将 字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。 请在程序的下划…

华为p40 pro原理图_4188起 华为P40/Pro/Pro+国行发布 顶配8888 河图正式上线!

声音 | 小白昨天晚上19:30,华为举行了时长两个多小时的新品发布会,正式带来了华为P40系列国行版,以及一系列的手机配件类新品和其他新品(见后面的文章),由于详细配置之前海外发布会已经公布的差不多了,咱废…

mysql日期加减

1. MySQL 为日期增加一个时间间隔:date_add() set dt now(); select date_add(dt, interval 1 day); - 加1天 select date_add(dt, interval 1 hour); -加1小时 select date_add(dt, interval 1 minute); - 加1分钟 select date_add(dt, int…

Chapter2(变量和基础类型)--C++Prime笔记

数据类型选择的准则:①当明确知晓数值不可能为负时,选用无符号类型。②使用int执行整数运算。在实际应用中,short常常显得太小而long一般和int有一样的尺寸。如果运算范围超过int的表示范围,则选用long long。③在算术表达式中不要…

redis 值字符串前面部分乱码_StringBoot 整合Redis解决存储乱码(通过StringRedisSerializer来进行序列化)...

org.springframework.bootspring-boot-starter-redis1.4.7.RELEASE注意:spring-boot-starter-data-redis与spring-boot-starter-redis引入的包基本一致,都是基于Jedis的,所以没区别。第一种方法:在你需要调用RedisTemplate的类中引…

全国计算机等级考试题库二级C操作题100套(第06套)

第06套: 给定程序中,函数fun的功能是根据形参i的值返回某个函数的值。当调用正确时, 程序输出: x15.000000, x23.000000, x1x1x1x240.000000 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。 注意:源程序…

最新处理器排名_安兔兔Android处理器天梯榜发布:最强的还是它

点击上方蓝字【安兔兔】关注我文章每天不断更!为了让大家对自己使用的手机处理器性能有一个更直观的认知,安兔兔今天正式发布了Android手机处理器天梯榜。由于安兔兔V8增加了存储和刷新率在总分方面所占据的权重,因此为了避免手机配置对排名造…

vue动态切换css文件_如何在vue组件中动态的引入css文件?

问题描述如标签描述的不准确,请见新直能分支调二浏页器朋代说谅我的需求是开的接都上的和,近很触是没他电同近很触是没发多套皮肤,打包的时候只加载其中某一种的皮肤(不需要动态换肤),因为css文件过大,后期配套的css文…

fastreport 直接调网络打印机_为什么UV打印机不能打印凹凸不平的材料?

大家都知道UV打印机又叫万能平板打印机,顾名思义就是什么都能打?答案当然是否定的!万能只是说它可以打印的材料很广泛,而不是大家根据字面所理解的。那么什么样的材料是UV打印机所不能打印的呢?今天小编就单单讲讲其中…

[译]JavaScript:ES6中的模板字符串简介

原文:http://tc39wiki.calculist.org/es6/template-strings/ ES6中的模板字符串(template string)是一种能在字符串文本中内嵌表达式的字符串字面量(string literal).这种操作在其他语言(比如shell->perl->php等)中通常称之为字符串内插(string interpolation)或者叫变量…

全国计算机等级考试题库二级C操作题100套(第07套)

第07套: 程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的信息。函数fun的功能是输出这位学生的信息。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的BLA…

【NOI 2018】归程(Kruskal重构树)

题面在这里就不放了。 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信…

jdbc连接mysql数据库的常用对象_JDBC常用对象

主要作用:注册驱动 实际开发中使用Class.forName("com.mysql,jdbc.Drive");这种方式,因为之前的方式会导致注册两次驱动获得连接 Connection getConnection(String url,String username,String password)url写法:jdbc:mysql://loca…

latex大括号 多行公式_如何快速入门 LaTeX,在 XMind 2020 中轻松输入方程。

数学方程输入对于很多理工科朋友来说是一件让人头疼的事情。不仅是数学方程本身就纷繁复杂花样百出,各种输入语法更是劝退无数人。然而很多看似复杂的东西其实并非如想象中的难,抓住本质即可快速入门。今天和大家分享下如何快速入门 LaTeX,在…

全国计算机等级考试题库二级C操作题100套(第08套)

更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程刷题面经求职讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进…

部署及配置Lync Server 2013 监控功能

在上面一篇文章中我们已经部署了存档功能,并且在标准版环境搭建了一台SQLServer服务器作为后端数据库服务器,有了这台服务器我们可以做什么呢?存档,当然还有监控,以及整个CMS。当然这都是一步一步演变的,并…

python处理excel的方法有哪些_python简单处理excel方法

1 # codingutf-8 2 3 import xlrd # 读模块4 import xlwt # 写模块5 6 7 def read_excel():8 """9 读取excel文件方法说明(此函数只是对xlrd用法的说明,看看就好。xlrd已经很好用了)10 :return:11 """12 # 打开…

mysql 客户服务号获取_《MySQL排错指南》——1.4 获取查询信息-阿里云开发者社区...

本节书摘来自异步社区出版社《MySQL排错指南》一书中的第1章,第1.4节,作者:【美】Sveta Smirnova(斯维特 斯米尔诺娃),更多章节内容可以访问云栖社区“异步社区”公众号查看。1.4 获取查询信息正如前一节看到的一样,数…

全国计算机等级考试题库二级C操作题100套(第09套)

第09套: 给定程序中,函数fun的功能是将不带头节点的单向链表结点数据域中的数据从小到大排序。即若原链表结点数据域从头至尾的数据为:10、4、2、8、6,排序后链表结点数据域从头至尾的数据为:2、4、6、8、10。 请在程序的下划线处…