协程 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 ...
随机推荐
- mac 全角/半角标点符号切换
快捷键:option+shift+H 背景是这样的,前段时间sublimeText新装了HTML/CSS/JS Prittify,JS代码格式化的快捷键是:command+shift+H. 记性有点差 ...
- Hive分区
注意:必须在表定义时指定对应的partition字段. 一.指定分区 1.单分区 建表语句:create table day_table(id int, content string) partiti ...
- C#-简介(一)
1.C#语言简介 C#计算机语言 是一门高级计算机语言 他的开发模式更接近人类和社会的思维模式,有助于提高开发效率 C#历史 1998年COOL这个项目是C#语言的前身,由微软 Anders Hejl ...
- mssql sqlserver 取消数值四舍五入的方法分享
摘要: 下文讲述使用round sql函数,对数值型数据进行舍入操作 实验环境:sqlserver 2008 转自: http://www.maomao365.com/?p=6454 最近接到用户需求 ...
- oracle大数据量更新引发的死锁问题解决方法及oracle分区和存储过程的思考
前言 前几天上午在对数据库的一张表进行操作的时候,由于这张表是按照时间的一张统计表,正好到那天没有测试数据了,于是我想将表中所有的时间,统一更新到后一个月,于是对80w条数据的更新开始了.整个过程曲折 ...
- hive笔记:复杂数据类型-array结构
array 结构 (1)语法:array(val1,val2,val3,…) 操作类型:array array类型的数据可以通过'数组名[index]'的方式访问,index从0开始: (2)建表: ...
- C语言 大小写字母转换
//凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 方法1: #include<stdio.h> #include<stdlib.h> ...
- 给 datepicker 设定日期格式
datepicker 是 JQueryUI 提供的日期控件,仅提供日期选择,不提供时间,但基本够用了. 其日期格式默认是:mm/dd/yy 格式字符代表的含义如下: d - 每月的第几天 (没有前导零 ...
- ES5-ES6-ES7_class类
传统创建对象模板的方式 JavaScript 语言中,生成实例对象的传统方法是通过构造函数 //JavaScript 语言中,生成实例对象的传统方法是通过构造函数 function Point(x, ...
- Linux之定时任务crond
定时任务说明与分类 定时任务的应用场景举例 每天晚上 12点备份/etc/目录 tar 定时任务的三种分类 crond(crontab)定时任务软件(软件包cronie),用的最多的一种 atd,应用 ...