协程 IO多路复用
-----------------------------------------------------------------试试并非受罪,问问并不吃亏。善于发问的人,知识丰富。
# # ------------------------------------------------------------------------------------------------------------#
协程:gevent
Gevent.spawn(func,123)
Join () 等待异步提交的这些任务执行完毕
joinall
IO多路复用
阻塞IO
非阻塞IO模型
Io多路复用
Select 将所有需要监听的对象,放到一个列表里面,将这个列表交给select来监听,凡是有动静的对象,直接给你返回到一个列表中,然后我们循环这个列表,根据列表里面的有动静的对象,来进行对应的操作. window 和 linux
Poll : 监听的对象数量没有上限,而select默认是1024个,Linux
Select和poll内部在监听的所有对象的时候,是循环遍历的操作,挨个问一遍有没有数据
Epoll : linux,每个被监听的对象,都是通过回调机制来搞的,也就是,监听的列表对象里面的这个对象,凡是有动静,自行通知epoll,然后epoll把这些有动静的对象返回.
异步IO 最NB的,效率最高,因为将网络请求里面的两个io时间都省了
from gevent import monkey;monkey.patch_all
import time
import gevent def func1(n):
print('xxxx',n)
#gevent.sleep(2)
time.sleep(2)
print("yyyy",n) def func2(m):
print('oooo',m)
# gevent.sleep(2)
time.sleep(2)
print("kkkk", m) g1 = gevent.gevent(func1,"马拉多纳")
g2 = gevent.gevent(func2,"罗纳尔多") # # --------------[生成器版的任务切换]-------------- import time def jishi1hao():
for i in range(11):
# print('到这里来!')
yield #帮我们记录了任务的执行状态
time.sleep(1)
print('%s号客户2秒就搞定'%i) def jishi2hao():
g = jishi1hao() #获得生成器
next(g)
for i in range(10):
time.sleep(1)
print('%s号技师,正在忙'%i)
next(g) # jishi1hao()
jishi2hao() # # --------------[02 greenlet简单使用]-------------- import time
import greenlet def func1():
time.sleep(2)
print('约吗?')
g2.switch()
time.sleep(2)
print('不约')
g2.switch() def func2():
time.sleep(2)
print('你好')
g1.switch()
time.sleep(2)
print('你不好') g1 = greenlet.greenlet(func1)
g2 = greenlet.greenlet(func2) g1.switch() # # --------------[03 gevent简单使用]-------------- from gevent import monkey;monkey.patch_all()
import time
import gevent def func1(n):
print('xxxxxx',n)
# gevent.sleep(2)
time.sleep(2)
print('cccccc',n) def func2(m):
print('111111',m)
# gevent.sleep(2)
time.sleep(2)
print('222222',m) start_time = time.time()
g1 = gevent.spawn(func1,'alex')
g2 = gevent.spawn(func2,'德玛西亚')
# g1.join() #
# g2.join()
gevent.joinall([g1,g2])
end_time = time.time()
print(end_time - start_time) print('代码结束') # # --------------[04 非阻塞IO模型客户端]--------------
import socket
client = socket.socket() client.connect(('127.0.0.1',8001))
while 1:
to_server_msg = input('我想对你说>>>>')
client.send(to_server_msg.encode('utf-8'))
from_server_msg = client.recv(1024)
print(from_server_msg.decode('utf-8')) # # --------------[04 非阻塞IO模型服务端]--------------
import time
import socket server = socket.socket() ip_port = ('127.0.0.1',8001)
server.bind(ip_port) server.listen()
server.setblocking(False)
conn_list = [] while 1:
while 1:
try:
conn,addr = server.accept()
conn_list.append(conn)
break
except BlockingIOError:
time.sleep(0.1)
print('此时还没有人链接我') for sock in conn_list:
print(sock)
while 1:
try:
from_client_msg = sock.recv(1024)
print(from_client_msg.decode('utf-8'))
sock.send(b'hello')
break
except BlockingIOError:
print('还没有任何的消息啊')
协程 IO多路复用的更多相关文章
- 协程IO多路复用
协程:单线程下实现并发并发:伪并行,遇到IO就切换,单核下多个任务之间切换执行,给你的效果就是貌似你的几个程序在同时执行.提高效率任务切换 + 保存状态并行:多核cpu,真正的同时执行串行:一个任务执 ...
- day 35 协程 IO多路复用
0.基于socket发送Http请求 import socket import requests # 方式一 ret = requests.get('https://www.baidu.com/s?w ...
- Python之路--协程/IO多路复用
引子: 之前学习过了,线程,进程的概念,知道了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位.按道理来说我们已经算是把CPU的利用率提高很多了.但是我们知道无论是创建多进程还是创建多 ...
- 12_进程,线程,协程,IO多路复用的区别
1.进程 1.进程可以使用计算机多核 2.进程是资源分配的单位 3.进程的创建要比线程消耗更多的资源效率很低 4.进程空间独立,数据安全性跟好操作有专门的进程间通信方式 5.一个进程可以包含多个线程, ...
- Day 42 协程. IO 并发
一.什么是协程? 是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 协程相比于线程切换效率更快了. ...
- Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多路模型/select/poll/epoll/selector】
一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socke ...
- 05网络并发 ( GIL+进程池与线程池+协程+IO模型 )
目录 05 网络并发 05 网络并发
- 协程 & IO模型 & HTTP协议
今日内容 进程池与线程池的基本使用 协程理论与实操 IO模型 前端简介 内容详细 一.进程池与线程池的基本使用 1.进程池与线程池的作用 为了保证计算机硬件安全的前提下,提升程序的运行效率 2.回调机 ...
- 协程+IO切换实现并发
from gevent import monkey # 以后代码中遇到IO都会自动执行greenlet的switch进行切换 monkey.patch_all() import requests im ...
随机推荐
- JSON基础知识点
一.介绍: JSON是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成. 二.数据格式: 1.JSON建构于两种数据格式: “名称/值”对(键值对)的集合,不同的语言中,它被理解为 ...
- GPA简介
GPA(Graphics Performance Analyzers)是Intel公司提供的一款免费的跨平台性能分析工具. 填写e-mail.name和country并提交后,就会收到一封有专属下载链 ...
- 洗礼灵魂,修炼python(90)-- 知识拾遗篇 —— 协程
协程 1.定义 协程,顾名思义,程序协商着运行,并非像线程那样争抢着运行.协程又叫微线程,一种用户态轻量级线程.协程就是一个单线程(一个脚本运行的都是单线程) 协程拥有自己的寄存器上下文和栈.协程调度 ...
- Android Studio移除模块
一.打开文件菜单下的项目结构 二.在项目结构中选中模块,点击-号,然后删除 三.删除本地文件,移除模块成功
- [Hive_8] Hive 设计优化
0. 说明 在 Hive 中,数据库是一个文件夹,表也是文件夹 partition,是一个字段,是文件 前提:在 Hive 进行 where 子句查询的时候,会将条件语句和全表进行比对,搜索出所需的数 ...
- js对WebApi请求的基本操作
在WebAPI对外提供的,大概有4种接口,get,post,delete,put,现在,我就简单的来说一下js请求webApi的方式和大概的作用: get:在webApi中,get方法通常是用来获取数 ...
- Eclipse修改Maven仓库配置
修改Apache-Maven\conf下的settings.xml文件 <?xml version="1.0" encoding="UTF-8"?> ...
- php curl参数详解之post方法
利用记录的URL参数解释,写一个post方法: <?php function do_post($url, $data) { $ch = curl_init(); //设置CURLOPT_RETU ...
- SQL server 数据库的索引和视图、存储过程和触发器
1.索引:数据排序的方法,快速查询数据 分类: 唯一索引:不允许有相同值 主键索引:自动创建的主键对应的索引,命令方式不可删 聚集索引:物理顺序与索引顺序一致,只能创建一个 非聚集索引:物理顺序与索引 ...
- [福大软工] Z班 第2次成绩排行榜
作业链接 http://www.cnblogs.com/easteast/p/7469291.html 评分细则 本次个人项目分数由三部分组成,分别是 (1)博客 - 20分,分数组成如下: 在文章开 ...