Python高级
回顾
udp:
1.使用udp进行通话:socket(AF_INET,SOCK_DGRAM)
接收:recvfrom()
发送:sendto()
2.多线程的:
socket对象
线程---->socket.sendto() ---> 聊多句
线程---->sock.recvfrom() ---> 收多句
3.udp广播:
屏幕广播
飞秋
tcp:
网络通信
集线器 hub
交换机 switch
路由器 router
IMCP ARP(物理地址)
server 服务器
域名 ---》 域名解析器 ----》IP ----》
tcp:
三次握手
四次挥手
tcp编程:
服务端
客户端
基础版
客户端
from socket import *
import time
from threading import Thread
client_socket = socket(AF_INET, SOCK_STREAM)
client_socket.connect(("127.0.0.1", 8089))
# 定义子线程的任务
def recv_msg(new_socket):
while True:
content = new_socket.recv(1024)
msg = content.decode("utf-8")
print(msg)
if msg == "bye" or len(msg)==0:
break
# # 关闭new_socket
# new_socket.close()
def send_msg(new_socket): # socket对象
while True:
msg = input("请输入:")
new_socket.send(msg.encode("utf-8"))
# 定义子线程 如果两个线程共用一个socket,不会受到影响
Thread(target=recv_msg, args=(client_socket,)).start()
Thread(target=send_msg, args=(client_socket,)).start()
服务器
from socket import *
import time
# 1.创建对象
from threading import Thread
server_socket = socket(AF_INET, SOCK_STREAM)
# 设置目的 复用 OSError: [Errno 48] Address already in use
server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
# 2. 8089
server_socket.bind(("", 8089))
# 3.设置监听
server_socket.listen(5)
# 定义子线程的任务
def recv_msg(new_socket):
while True:
content = new_socket.recv(1024)
msg=content.decode("utf-8")
print(msg)
if len(msg) ==0:
break
def send_msg(new_socket):
while True:
msg=input("服务端输入:")
new_socket.send(msg.encode("utf-8"))
# 4.
def main():
while True:
# 产生新的socket
new_socket, new_addr = server_socket.accept()
print("===========>新的客户端访问:",new_addr)
# 定义子线程
Thread(target=recv_msg, args=(new_socket,)).start()
Thread(target=send_msg, args=(new_socket,)).start()
if __name__ == "__main__":
main()
单进程版服务器
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
# 创建tcp服务器套接字
server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定端口
server_socket.bind(("", 9999))
# 设置正常情况退出的服务器下,端口可以重用
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 设置监听,变为主动监听
server_socket.listen(5)
while True:
# 等待客户端的链接,返回新的socket和地址
new_socket, new_address = server_socket.accept()
# 接收数据,并且发送数据
try:
while True:
recv_data = new_socket.recv(1024)
# 当有客户端关闭后,recv解除阻塞,并且返回长度为0
if len(recv_data) > 0:
recv_content = recv_data.decode("gb2312")
print("收到:%s的信息是:%s" % (str(new_address), recv_content))
new_socket.send("thank you!".encode("gb2312"))
else:
print("客户端%s已经关闭" % (str(new_address)))
break
finally:
new_socket.close()
print("关闭%s客户端" % (str(new_address)))
# 关闭tcp服务器套接字
server_socket.close()
多线程版服务器
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
# 创建tcp服务器套接字
from threading import Thread
server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定端口
server_socket.bind(("", 9999))
# 设置正常情况退出的服务器下,端口可以重用
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 设置监听,变为主动监听
server_socket.listen(5)
def recv_msg(new_socket,new_address):
while True:
recv_data = new_socket.recv(1024)
# 当有客户端关闭后,recv解除阻塞,并且返回长度为0
if len(recv_data) > 0:
recv_content = recv_data.decode("gb2312")
print("收到:%s的信息是:%s" % (str(new_address), recv_content))
new_socket.send("thank you!".encode("gb2312"))
else:
print("客户端%s已经关闭" % (str(new_address)))
break
def main():
try:
while True:
# 等待客户端的链接,返回新的socket和地址
new_socket, new_address = server_socket.accept()
# 接收数据,并且发送数据
Thread(target=recv_msg, args=(new_socket,new_address)).start()
finally:
# 关闭tcp服务器套接字
server_socket.close()
print("关闭%s客户端" % (str(new_address)))
if __name__=="__main__":
main()
多进程版服务器
from multiprocessing import Process
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
# 创建tcp服务器套接字
from threading import Thread
server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定端口
server_socket.bind(("", 9999))
# 设置正常情况退出的服务器下,端口可以重用
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 设置监听,变为主动监听
server_socket.listen(5)
def recv_msg(new_socket,new_address):
while True:
recv_data = new_socket.recv(1024)
# 当有客户端关闭后,recv解除阻塞,并且返回长度为0
if len(recv_data) > 0:
recv_content = recv_data.decode("gb2312")
print("收到:%s的信息是:%s" % (str(new_address), recv_content))
new_socket.send("thank you!".encode("gb2312"))
else:
print("客户端%s已经关闭" % (str(new_address)))
break
def main():
try:
while True:
# 等待客户端的链接,返回新的socket和地址
new_socket, new_address = server_socket.accept()
# 接收数据,并且发送数据
Process(target=recv_msg, args=(new_socket,new_address)).start()
finally:
# 关闭tcp服务器套接字
server_socket.close()
print("关闭%s客户端" % (str(new_address)))
if __name__=="__main__":
main()
单进程非阻塞
客户端
from socket import *
from threading import Thread
client_socket = socket(AF_INET, SOCK_STREAM)
client_socket.connect(("127.0.0.1", 9999))
client_socket.send("hello".encode("utf-8"))
client_socket.close()
服务器
from socket import *
server_socket=socket(AF_INET,SOCK_STREAM)
server_socket.bind(("",10000))
server_socket.listen(5)
server_socket.setblocking(False)
while True:
try:
# print("-----11111-----")
# 1. 报错 Resource temporarily unavailable 因为设置成非阻塞
new_socket,new_addr=server_socket.accept()
print("------22222----",new_addr)
except:
# print("----33333----")
pass
select
import select
import sys
# 标准的输入
f=sys.stdin # r 读取键盘信息
print(f)
print(f.fileno())
f=sys.stdout # w 输出 到控制台
print(f)
print(f.fileno())
f=sys.stderr # w 报错输出
print(f)
print(f.fileno())
f1=open("./aa.py","r") # 向文件中写入信息
print(f1)
print(f1.fileno())
f1=open("./bb.py","w") # 向文件中写入信息
print(f1)
print(f1.fileno())
echo客户端
from socket import *
from threading import Thread
client_socket = socket(AF_INET, SOCK_STREAM)
client_socket.connect(("192.168.28.52", 9999))
client_socket.send("hello".encode("utf-8"))
while True:
msg = client_socket.recv(1024)
print(msg.decode("utf-8"))
client_socket.close()
echo服务器
from socket import *
import select
import sys
server_socket = socket(AF_INET, SOCK_STREAM)
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server_socket.bind(("", 9999))
server_socket.listen(5)
# 客户列表
socket_list = [server_socket]
try:
while True:
print("-----11111----")
read_list, write_list, error_list = select.select(socket_list, [], socket_list)
# print(read_list, write_list, error_list)
for sock in read_list:
if sock==server_socket:
print("sock==server_socket")
new_socket,new_addr=server_socket.accept()
# 将new_socket添加到列表、
socket_list.append(new_socket) # [server_socket,new_socket]
else:
recv_msg=sock.recv(1024)
if len(recv_msg)==0:
print("客户端断开了")
socket_list.remove(sock)
elif len(recv_msg)>0:
print("收到消息:",recv_msg.decode("utf-8"))
# 回声
sock.send(recv_msg) # 发送同样的信息
except:
print("----->有异常了")
finally:
server_socket.close()
扩展
from socket import *
import select
import sys
server_socket = socket(AF_INET, SOCK_STREAM)
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server_socket.bind(("", 9999))
server_socket.listen(5)
# 客户列表
socket_list = [server_socket,sys.stdin] # 读取的列表
writeable_list=[]
try:
while True:
print("-----11111----")
read_list, write_list, error_list = select.select(socket_list, writeable_list, socket_list)
# print(read_list, write_list, error_list)
for sock in read_list:
if sock==server_socket:
print("sock==server_socket")
new_socket,new_addr=server_socket.accept()
# 将new_socket添加到列表、
socket_list.append(new_socket) # [server_socket,new_socket]
elif sock==sys.stdin:
msg=sys.stdin.readline()
print("键盘输入的内容:",msg)
else:
recv_msg=sock.recv(1024)
if len(recv_msg)==0:
print("客户端断开了")
socket_list.remove(sock)
elif len(recv_msg)>0:
print("收到消息:",recv_msg.decode("utf-8"))
# 回声
sock.send(recv_msg) # 发送同样的信息
except:
print("----->有异常了")
finally:
server_socket.close()
扩展写部分
from socket import *
import select
import sys
server_socket = socket(AF_INET, SOCK_STREAM)
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server_socket.bind(("", 9999))
server_socket.listen(5)
# 客户列表
socket_list = [server_socket,sys.stdin] # 读取的列表
#写列表
writeable_list=[]
try:
while True:
print("-----11111----")
read_list, write_list, error_list = select.select(socket_list, writeable_list, socket_list)
print(read_list,write_list,error_list)
# 遍历写列表
for sock in write_list:
print("========>write")
sock.send("hello world".encode("utf-8"))
# 遍历可读列表
for sock in read_list:
if sock==server_socket:
print("sock==server_socket")
new_socket,new_addr=server_socket.accept()
# 将new_socket添加到列表、
socket_list.append(new_socket) # [server_socket,new_socket]
elif sock==sys.stdin:
msg=sys.stdin.readline()
print("键盘输入的内容:",msg)
else:
recv_msg=sock.recv(1024)
if len(recv_msg)==0:
print("客户端断开了")
socket_list.remove(sock)
elif len(recv_msg)>0:
print("收到消息:",recv_msg.decode("utf-8"))
# 回声
sock.send(recv_msg) # 发送同样的信息
writeable_list.append(sock)
except:
print("----->有异常了")
finally:
server_socket.close()
epoll
1.select ---> 32:1024 | 64: 2048 --->轮询
2.poll ---》提升版 select ---》提升了个数,(个数没有限制的了)
3.epoll ---> linux window mac(kqueue)
事件触发机制
文件描述符 事件 ---》callback
服务器
from select import *
from socket import *
server_socket=socket(AF_INET,SOCK_STREAM)
server_socket.bind(("",9999))
server_socket.listen(5)
# 创建epoll对象
epol=epoll()
# 注册事件
epol.register(server_socket.fileno(),EPOLLIN|EPOLLET)
# 装socket的列表
socket_list={}
#装socket的地址
socket_addr={}
while True:
print("-------1111111-------")
epoll_list=epol.poll() # [(fd,事件),(),(),()]
print("--------22222------")
for fd,event in epoll_list:
# 有新的连接
if fd==server_socket.fileno():
new_socket,new_addr=server_socket.accept()
#\往子典中添加数据
socket_list[new_socket.fileno()]=new_socket
socket_addr[new_socket.fileno()]=new_addr
# 注册事件
epol.register(new_socket.fileno(),EPOLLIN|EPOLLET)
elif event==EPOLLIN:
print("哈哈哈!收到数据了")
new_socket=socket_list[fd]
new_addr=socket_addr[fd]
# 读取数据
content=new_socket.recv(1024)
if len(content)>0:
print("收到数据是:",content.decode("utf-8"))
else:
epol.unregister(fd) # 取消注册
new_socket.close()
print(new_addr,"下线了....")
协程
生成器
import time
def a():
for i in range(3):
print("A")
yield
time.sleep(0.5)
def b(obj):
for i in range(3):
print("B")
next(obj)
time.sleep(0.5)
a1=a()
b(a1)
greenlet
from greenlet import greenlet
import time
def a():
for i in range(3):
print("A")
gr2.switch()
time.sleep(0.5)
def b():
for i in range(3):
print("B")
gr3.switch()
time.sleep(0.5)
def c():
for i in range(3):
print("c")
gr1.switch()
time.sleep(0.5)
def main():
gr1.switch()# 类似执行函数
if __name__=="__main__":
gr1=greenlet(a)
gr2=greenlet(b)
gr3=greenlet(c)
main()
gevent
import gevent
# 看谁sleep ,睡觉的就要给另外一个任务让步
def task1(n):
print("--->",n)
for i in range(10):
print("-----------AAAAA------------")
gevent.sleep(1)
def task2(n):
for i in range(10):
print("-----BBBBBB------")
gevent.sleep(1)
def main():
# 创建gevent对象
g1=gevent.spawn(task1,5)
g2=gevent.spawn(task2,5)
g1.join()
g2.join()
if __name__=="__main__":
main()
回顾
udp:
1.使用udp进行通话:socket(AF_INET,SOCK_DGRAM)
接收:recvfrom()
发送:sendto()
2.多线程的:
socket对象
线程---->socket.sendto() ---> 聊多句
线程---->sock.recvfrom() ---> 收多句
3.udp广播:
屏幕广播
飞秋
tcp:
网络通信
集线器 hub
交换机 switch
路由器 router
IMCP ARP(物理地址)
server 服务器
域名 ---》 域名解析器 ----》IP ----》
tcp:
三次握手
四次挥手
tcp编程:
服务端
客户端
基础版
客户端
from socket import *
import time
from threading import Thread
client_socket = socket(AF_INET, SOCK_STREAM)
client_socket.connect(("127.0.0.1", 8089))
# 定义子线程的任务
def recv_msg(new_socket):
while True:
content = new_socket.recv(1024)
msg = content.decode("utf-8")
print(msg)
if msg == "bye" or len(msg)==0:
break
# # 关闭new_socket
# new_socket.close()
def send_msg(new_socket): # socket对象
while True:
msg = input("请输入:")
new_socket.send(msg.encode("utf-8"))
# 定义子线程 如果两个线程共用一个socket,不会受到影响
Thread(target=recv_msg, args=(client_socket,)).start()
Thread(target=send_msg, args=(client_socket,)).start()
服务器
from socket import *
import time
# 1.创建对象
from threading import Thread
server_socket = socket(AF_INET, SOCK_STREAM)
# 设置目的 复用 OSError: [Errno 48] Address already in use
server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
# 2. 8089
server_socket.bind(("", 8089))
# 3.设置监听
server_socket.listen(5)
# 定义子线程的任务
def recv_msg(new_socket):
while True:
content = new_socket.recv(1024)
msg=content.decode("utf-8")
print(msg)
if len(msg) ==0:
break
def send_msg(new_socket):
while True:
msg=input("服务端输入:")
new_socket.send(msg.encode("utf-8"))
# 4.
def main():
while True:
# 产生新的socket
new_socket, new_addr = server_socket.accept()
print("===========>新的客户端访问:",new_addr)
# 定义子线程
Thread(target=recv_msg, args=(new_socket,)).start()
Thread(target=send_msg, args=(new_socket,)).start()
if __name__ == "__main__":
main()
单进程版服务器
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
# 创建tcp服务器套接字
server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定端口
server_socket.bind(("", 9999))
# 设置正常情况退出的服务器下,端口可以重用
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 设置监听,变为主动监听
server_socket.listen(5)
while True:
# 等待客户端的链接,返回新的socket和地址
new_socket, new_address = server_socket.accept()
# 接收数据,并且发送数据
try:
while True:
recv_data = new_socket.recv(1024)
# 当有客户端关闭后,recv解除阻塞,并且返回长度为0
if len(recv_data) > 0:
recv_content = recv_data.decode("gb2312")
print("收到:%s的信息是:%s" % (str(new_address), recv_content))
new_socket.send("thank you!".encode("gb2312"))
else:
print("客户端%s已经关闭" % (str(new_address)))
break
finally:
new_socket.close()
print("关闭%s客户端" % (str(new_address)))
# 关闭tcp服务器套接字
server_socket.close()
多线程版服务器
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
# 创建tcp服务器套接字
from threading import Thread
server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定端口
server_socket.bind(("", 9999))
# 设置正常情况退出的服务器下,端口可以重用
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 设置监听,变为主动监听
server_socket.listen(5)
def recv_msg(new_socket,new_address):
while True:
recv_data = new_socket.recv(1024)
# 当有客户端关闭后,recv解除阻塞,并且返回长度为0
if len(recv_data) > 0:
recv_content = recv_data.decode("gb2312")
print("收到:%s的信息是:%s" % (str(new_address), recv_content))
new_socket.send("thank you!".encode("gb2312"))
else:
print("客户端%s已经关闭" % (str(new_address)))
break
def main():
try:
while True:
# 等待客户端的链接,返回新的socket和地址
new_socket, new_address = server_socket.accept()
# 接收数据,并且发送数据
Thread(target=recv_msg, args=(new_socket,new_address)).start()
finally:
# 关闭tcp服务器套接字
server_socket.close()
print("关闭%s客户端" % (str(new_address)))
if __name__=="__main__":
main()
多进程版服务器
from multiprocessing import Process
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
# 创建tcp服务器套接字
from threading import Thread
server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定端口
server_socket.bind(("", 9999))
# 设置正常情况退出的服务器下,端口可以重用
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 设置监听,变为主动监听
server_socket.listen(5)
def recv_msg(new_socket,new_address):
while True:
recv_data = new_socket.recv(1024)
# 当有客户端关闭后,recv解除阻塞,并且返回长度为0
if len(recv_data) > 0:
recv_content = recv_data.decode("gb2312")
print("收到:%s的信息是:%s" % (str(new_address), recv_content))
new_socket.send("thank you!".encode("gb2312"))
else:
print("客户端%s已经关闭" % (str(new_address)))
break
def main():
try:
while True:
# 等待客户端的链接,返回新的socket和地址
new_socket, new_address = server_socket.accept()
# 接收数据,并且发送数据
Process(target=recv_msg, args=(new_socket,new_address)).start()
finally:
# 关闭tcp服务器套接字
server_socket.close()
print("关闭%s客户端" % (str(new_address)))
if __name__=="__main__":
main()
单进程非阻塞
客户端
from socket import *
from threading import Thread
client_socket = socket(AF_INET, SOCK_STREAM)
client_socket.connect(("127.0.0.1", 9999))
client_socket.send("hello".encode("utf-8"))
client_socket.close()
服务器
from socket import *
server_socket=socket(AF_INET,SOCK_STREAM)
server_socket.bind(("",10000))
server_socket.listen(5)
server_socket.setblocking(False)
while True:
try:
# print("-----11111-----")
# 1. 报错 Resource temporarily unavailable 因为设置成非阻塞
new_socket,new_addr=server_socket.accept()
print("------22222----",new_addr)
except:
# print("----33333----")
pass
select
import select
import sys
# 标准的输入
f=sys.stdin # r 读取键盘信息
print(f)
print(f.fileno())
f=sys.stdout # w 输出 到控制台
print(f)
print(f.fileno())
f=sys.stderr # w 报错输出
print(f)
print(f.fileno())
f1=open("./aa.py","r") # 向文件中写入信息
print(f1)
print(f1.fileno())
f1=open("./bb.py","w") # 向文件中写入信息
print(f1)
print(f1.fileno())
echo客户端
from socket import *
from threading import Thread
client_socket = socket(AF_INET, SOCK_STREAM)
client_socket.connect(("192.168.28.52", 9999))
client_socket.send("hello".encode("utf-8"))
while True:
msg = client_socket.recv(1024)
print(msg.decode("utf-8"))
client_socket.close()
echo服务器
from socket import *
import select
import sys
server_socket = socket(AF_INET, SOCK_STREAM)
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server_socket.bind(("", 9999))
server_socket.listen(5)
# 客户列表
socket_list = [server_socket]
try:
while True:
print("-----11111----")
read_list, write_list, error_list = select.select(socket_list, [], socket_list)
# print(read_list, write_list, error_list)
for sock in read_list:
if sock==server_socket:
print("sock==server_socket")
new_socket,new_addr=server_socket.accept()
# 将new_socket添加到列表、
socket_list.append(new_socket) # [server_socket,new_socket]
else:
recv_msg=sock.recv(1024)
if len(recv_msg)==0:
print("客户端断开了")
socket_list.remove(sock)
elif len(recv_msg)>0:
print("收到消息:",recv_msg.decode("utf-8"))
# 回声
sock.send(recv_msg) # 发送同样的信息
except:
print("----->有异常了")
finally:
server_socket.close()
扩展
from socket import *
import select
import sys
server_socket = socket(AF_INET, SOCK_STREAM)
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server_socket.bind(("", 9999))
server_socket.listen(5)
# 客户列表
socket_list = [server_socket,sys.stdin] # 读取的列表
writeable_list=[]
try:
while True:
print("-----11111----")
read_list, write_list, error_list = select.select(socket_list, writeable_list, socket_list)
# print(read_list, write_list, error_list)
for sock in read_list:
if sock==server_socket:
print("sock==server_socket")
new_socket,new_addr=server_socket.accept()
# 将new_socket添加到列表、
socket_list.append(new_socket) # [server_socket,new_socket]
elif sock==sys.stdin:
msg=sys.stdin.readline()
print("键盘输入的内容:",msg)
else:
recv_msg=sock.recv(1024)
if len(recv_msg)==0:
print("客户端断开了")
socket_list.remove(sock)
elif len(recv_msg)>0:
print("收到消息:",recv_msg.decode("utf-8"))
# 回声
sock.send(recv_msg) # 发送同样的信息
except:
print("----->有异常了")
finally:
server_socket.close()
扩展写部分
from socket import *
import select
import sys
server_socket = socket(AF_INET, SOCK_STREAM)
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server_socket.bind(("", 9999))
server_socket.listen(5)
# 客户列表
socket_list = [server_socket,sys.stdin] # 读取的列表
#写列表
writeable_list=[]
try:
while True:
print("-----11111----")
read_list, write_list, error_list = select.select(socket_list, writeable_list, socket_list)
print(read_list,write_list,error_list)
# 遍历写列表
for sock in write_list:
print("========>write")
sock.send("hello world".encode("utf-8"))
# 遍历可读列表
for sock in read_list:
if sock==server_socket:
print("sock==server_socket")
new_socket,new_addr=server_socket.accept()
# 将new_socket添加到列表、
socket_list.append(new_socket) # [server_socket,new_socket]
elif sock==sys.stdin:
msg=sys.stdin.readline()
print("键盘输入的内容:",msg)
else:
recv_msg=sock.recv(1024)
if len(recv_msg)==0:
print("客户端断开了")
socket_list.remove(sock)
elif len(recv_msg)>0:
print("收到消息:",recv_msg.decode("utf-8"))
# 回声
sock.send(recv_msg) # 发送同样的信息
writeable_list.append(sock)
except:
print("----->有异常了")
finally:
server_socket.close()
epoll
1.select ---> 32:1024 | 64: 2048 --->轮询
2.poll ---》提升版 select ---》提升了个数,(个数没有限制的了)
3.epoll ---> linux window mac(kqueue)
事件触发机制
文件描述符 事件 ---》callback
服务器
from select import *
from socket import *
server_socket=socket(AF_INET,SOCK_STREAM)
server_socket.bind(("",9999))
server_socket.listen(5)
# 创建epoll对象
epol=epoll()
# 注册事件
epol.register(server_socket.fileno(),EPOLLIN|EPOLLET)
# 装socket的列表
socket_list={}
#装socket的地址
socket_addr={}
while True:
print("-------1111111-------")
epoll_list=epol.poll() # [(fd,事件),(),(),()]
print("--------22222------")
for fd,event in epoll_list:
# 有新的连接
if fd==server_socket.fileno():
new_socket,new_addr=server_socket.accept()
#\往子典中添加数据
socket_list[new_socket.fileno()]=new_socket
socket_addr[new_socket.fileno()]=new_addr
# 注册事件
epol.register(new_socket.fileno(),EPOLLIN|EPOLLET)
elif event==EPOLLIN:
print("哈哈哈!收到数据了")
new_socket=socket_list[fd]
new_addr=socket_addr[fd]
# 读取数据
content=new_socket.recv(1024)
if len(content)>0:
print("收到数据是:",content.decode("utf-8"))
else:
epol.unregister(fd) # 取消注册
new_socket.close()
print(new_addr,"下线了....")
协程
生成器
import time
def a():
for i in range(3):
print("A")
yield
time.sleep(0.5)
def b(obj):
for i in range(3):
print("B")
next(obj)
time.sleep(0.5)
a1=a()
b(a1)
greenlet
from greenlet import greenlet
import time
def a():
for i in range(3):
print("A")
gr2.switch()
time.sleep(0.5)
def b():
for i in range(3):
print("B")
gr3.switch()
time.sleep(0.5)
def c():
for i in range(3):
print("c")
gr1.switch()
time.sleep(0.5)
def main():
gr1.switch()# 类似执行函数
if __name__=="__main__":
gr1=greenlet(a)
gr2=greenlet(b)
gr3=greenlet(c)
main()
gevent
import gevent
# 看谁sleep ,睡觉的就要给另外一个任务让步
def task1(n):
print("--->",n)
for i in range(10):
print("-----------AAAAA------------")
gevent.sleep(1)
def task2(n):
for i in range(10):
print("-----BBBBBB------")
gevent.sleep(1)
def main():
# 创建gevent对象
g1=gevent.spawn(task1,5)
g2=gevent.spawn(task2,5)
g1.join()
g2.join()
if __name__=="__main__":
main()