-----------------------------------------------------------------试试并非受罪,问问并不吃亏。善于发问的人,知识丰富。
# # ------------------------------------------------------------------------------------------------------------#
协程: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('还没有任何的消息啊')