协程 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('还没有任何的消息啊')







posted @ 2018-12-04 15:59  黄豆豆丨Dealdwong  阅读(168)  评论(1编辑  收藏  举报