协程,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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

基于交换芯片的五元组的PCL规则过滤功能

2019独角兽企业重金招聘Python工程师标准>>> 基于交换芯片的五元组的PCL规则过滤功能作者: 韩大卫吉林师范大学2012.12.10Not Approved by Document Control Review Copy Only基于Marvell 98DX51xx/81xx交换芯片的五元组等的策略规则(PCL)过滤功能.现将部分的功能的…

python docx 合并文档 图片_不再为处理PDF烦恼,python处理操作PDF全攻略

本篇聊下Python对pdf的各种操作,包含pdf转word,pdf转图片,pdf翻转,加密,加水印等。pdf转换word文档 保留格式pdf转换为word文档,被大众经常使用的是纯Python库pdfminer和python-docx搭配使用,不…

windows server 2012 初安装体验

昨天晚上的windows server 2012 已时行 了发布了,为之在之前我已进行了下载测试安装,本来晚间想用来在虚拟机下进行安装VM-tool工具的,但是却因种种原因没有成功,为之补一下前面没有安装的过程截图。 进入下载页后,下载…

安卓APP_ 控件(1)—— TextView

摘自:安卓APP_ 控件(1)—— TextView 作者:丶PURSUING 发布时间: 2021-03-28 21:53:49 网址:https://blog.csdn.net/weixin_44742824/article/details/115283233 本文为学习笔记,是安卓APP学习的…

用python做数据分析pdf_利用python进行数据分析pdf

利用python进行数据分析pdf微盘下载!《利用python进行数据分析》利用Python实现数据密集型应用由浅入深帮助读者解决数据分析问题~适合刚刚接触Python的分析人员以及刚刚接触科学计算的Python程序员。利用python进行数据分析简介: 还在苦苦寻觅用Python控…

安卓APP_ 控件(2)—— Button

摘自:安卓APP_ 控件(2)—— Button 作者:丶PURSUING 发布时间: 2021-03-29 14:20:54 网址:https://blog.csdn.net/weixin_44742824/article/details/115290501 开篇:安卓APP_ 控件(1…

安卓APP_ 控件(3)—— EditText

摘自:安卓APP_ 控件(3)—— EditText 作者:丶PURSUING 发布时间: 2021-03-29 18:43:40 网址:https://blog.csdn.net/weixin_44742824/article/details/115305883 开篇:安卓APP_ 控件&#xff08…

python做游戏怎么实现窗口_python和py游戏窗口类

你在draw_sprite()中有事件循环,所以它一直运行到游戏结束,window.set_background永远不会执行。在您的代码构造不正确。在我试着更正它,稍后再发送代码。在编辑:如何组织代码的简单示例。在现在它在一个文件中。在Pygame中总是一…

如何使得账户密码永不过期

如何使得账户密码永不过期 原文:如何使得账户密码永不过期可以通过以下vbs脚本做的使得账户密码永不过期 dim users获取所有用户set users getobject("winmgmts:{impersonationlevelimpersonate}").instancesof("win32_useraccount")for each user in use…

怎么下载并安装python_怎么下载官网python并安装

怎么下载官网python并安装?百度搜索Python官网。看到上图显示官网的没,点击进入。把鼠标移到downloads上,然后看到下拉选项,点击Windows。然后看到如下界面。这么多的安装包,该选那个呢。下图画圈的是版本号&#xff0…

匿名函数python_基于python内置函数与匿名函数详解

内置函数 Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() ascii() enumerate() input() oct() staticmethod() bin() eval() int() open() str() bool() exec() isinstance() pow() super()…

ASP.NET AJAX(服务器回调)

如果只用纯粹的 js ,你必须弥补 ASP.NET 服务器端抽象和有限的 HTML DOM 之间的鸿沟,这不简单,没有 VS 的智能提示和调试工具,编写无错的代码和诊断错误都非常困难。由于各种突发事件及实现的差异,编写能够在所有现代浏…