协程 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 ...
随机推荐
- 加密webconfig中的连接字符串,利用RSA非对称加密,利用windows保存密钥容器
简单的解决方法: WebConfig 加解密,未能使用提供程序“RsaProtectedConfigurationProvider”进行解密.提供程序返回错误消息为: 打不开 RSA 密钥容器.问题: ...
- kali2016.2(debian)快速安装mysql5.7.17
糊里糊涂的删除了kali原本的mysql5.6.27版本,原本的mysql与很多软件关联在一起,每次安装都失败,后来把相关的都卸载了(悲催的浪费了一天) 下载地址 debian mysql下载地址 ...
- java开发基础知识学习
java环境配置 classpath: .当前目录 path: java 命令所在目录 jdk安装目录 jdk/bin jre安装目录 jre/bin 安装JDK后配置环境变量如下: 安装过程用到了j ...
- 洗礼灵魂,修炼python(91)-- 知识拾遗篇 —— pymysql模块之python操作mysql增删改查
首先你得学会基本的mysql操作语句:mysql学习 其次,python要想操作mysql,靠python的内置模块是不行的,而如果通过os模块调用cmd命令虽然原理上是可以的,但是还是不太方便,那么 ...
- c/c++ 智能指针 shared_ptr 使用
智能指针 shared_ptr 使用 上一篇智能指针是啥玩意,介绍了什么是智能指针. 这一篇简单说说如何使用智能指针. 一,智能指针分3类:今天只唠唠shared_ptr shared_ptr uni ...
- 特别篇:Hyper-v群集模拟实战演示
介绍 由于前面几张的都是直接整理了下 九叔的hyper-v电子书发上来的,个人觉得他写的不是最详细,因此今天我按照自己的实际情况来写个模拟的实战演示.所有的东西都通过VMware WorkStatio ...
- [Hive_11] Hive 的高级聚合函数
0. 说明 Hive 的高级聚合函数 union all | grouping sets | cube | rollup pv //page view 页面访问量 uv //user view 访问人 ...
- 使用蒲公英路由器 X3 设置为网络中继器
由于我的路由器放的时间比较久没有用了,所以先让路由器来个升级.链接图如下: 在浏览器地址栏中输入 oraybox.com,系统会自动跳到 https://pgybox.oray.com/passpo ...
- Linux系统挂载Windows的共享文件夹
解决方案 在window上文件设置共享权限 在Linux上在 使用mount 命令挂载 Windows 共享文件夹 实验环境 redhat linux 7操作系统 服务器IP 192.168.100. ...
- Python爬虫-04:贴吧爬虫以及GET和POST的区别
目录 1. URL的组成 2. 贴吧爬虫 2.1. 只爬贴吧第一页 2.2. 爬取所有贴吧的页面 3. GET和POST的区别 3.1. GET请求 3.2. POST请求 3.3. 有道翻译模拟发送 ...