-----------------------------------------------------------------试试并非受罪,问问并不吃亏。善于发问的人,知识丰富。

# # ------------------------------------------------------------------------------------------------------------#

协程: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多路复用的更多相关文章

  1. 协程IO多路复用

    协程:单线程下实现并发并发:伪并行,遇到IO就切换,单核下多个任务之间切换执行,给你的效果就是貌似你的几个程序在同时执行.提高效率任务切换 + 保存状态并行:多核cpu,真正的同时执行串行:一个任务执 ...

  2. day 35 协程 IO多路复用

    0.基于socket发送Http请求 import socket import requests # 方式一 ret = requests.get('https://www.baidu.com/s?w ...

  3. Python之路--协程/IO多路复用

    引子: 之前学习过了,线程,进程的概念,知道了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位.按道理来说我们已经算是把CPU的利用率提高很多了.但是我们知道无论是创建多进程还是创建多 ...

  4. 12_进程,线程,协程,IO多路复用的区别

    1.进程 1.进程可以使用计算机多核 2.进程是资源分配的单位 3.进程的创建要比线程消耗更多的资源效率很低 4.进程空间独立,数据安全性跟好操作有专门的进程间通信方式 5.一个进程可以包含多个线程, ...

  5. Day 42 协程. IO 并发

    一.什么是协程? 是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 协程相比于线程切换效率更快了. ...

  6. Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多路模型/select/poll/epoll/selector】

    一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socke ...

  7. 05网络并发 ( GIL+进程池与线程池+协程+IO模型 )

    目录 05 网络并发 05 网络并发

  8. 协程 & IO模型 & HTTP协议

    今日内容 进程池与线程池的基本使用 协程理论与实操 IO模型 前端简介 内容详细 一.进程池与线程池的基本使用 1.进程池与线程池的作用 为了保证计算机硬件安全的前提下,提升程序的运行效率 2.回调机 ...

  9. 协程+IO切换实现并发

    from gevent import monkey # 以后代码中遇到IO都会自动执行greenlet的switch进行切换 monkey.patch_all() import requests im ...

随机推荐

  1. tkinter进阶版——ttk

    很长的一段时间里,我都是用tkinter进行GUI设计的,还写过一篇<tkinter模块常用参数>. 但后来慢慢地觉得,这个tkinter真的是有点丑啊. 于是,找到了现在的ttk. tt ...

  2. python如何实现类似php的引用赋值

    直接放代码,有注释,就不解析了 # ############################ # 改变一个变量的值,与之有关系的变量的值也会相等变化 # 类似php的引用赋值,宏观来看 # ##### ...

  3. TURN Server Windows 安装程序

    有了OfficeSIP TURN Server 安装包,记录一下. http://www.onlinedown.net/soft/94746.htm 开源代码(C#)和应用地址:https://sou ...

  4. SQL Server OPTION (OPTIMIZE FOR UNKNOWN) 测试总结

      关于SQL Server的查询提示OPTION (OPTIMIZE FOR UNKNOWN) ,它是解决参数嗅探的方法之一. 而且对应的SQL语句会缓存,不用每次都重编译.关键在于它的执行计划的准 ...

  5. spring4笔记----PropertyPlaceholderConfigurer 属性占位符配置器

    driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/spring username=root password= ...

  6. 【算法】LeetCode算法题-Maximum Subarray

    这是悦乐书的第154次更新,第156篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第13题(顺位题号是53).给定一个整数数组nums,找出一个最大和,此和是由数组中索引 ...

  7. Servlet(五):一个Servlet处理多个请求

    一.为什么要使用一个Servlet来处理多个请求? 当浏览器发送了一次请求到服务器时,servlet容器会根据请求的url-pattern找到对应的Servlet类,执行对应的doPost或doGet ...

  8. SSL 原理及 https 配置

    目录 1. SSL 原理 1.1. SSL 简介 1.2. 主要概念 1.3. 建立安全连接的过程 2. https 配置 (以 nginx 为例) SSL 原理 SSL 简介 SSL (Secure ...

  9. June 15. 2018 Week 24th Friday

    If at first you don't succeed, then dust yourself off and try again. 失败了没关系,重振旗鼓,从头再来. From Aaliyah, ...

  10. March 06th, 2018 Week 10th Tuesday

    Hope for the best, but prepare for the worst. 抱最好的愿望,做最坏的打算. To hope for the best and prepare for th ...