网络并发模型
网络并发模型概述
什么是网络并发
- 在实际工作中,一个服务端程序往往要应对多个客户端同时发起访问的情况。如果让服务端程序能够更好的同时满足更多客户端网络请求的情形,这就是并发网络模型
循环网络模型问题
- 循环网络模型只能循环接收客户端请求,处理请求。同一时刻只能处理一个请求,处理完毕后再处理下一个。这样的网络模型虽然简单,资源占用不多,但是无法同时处理多个客户端请求就是其最大的弊端,往往只有在一些低频的小请求任务中才会使用
多进程/线程并发模型
- 多进程/线程并发模中每当一个客户端连接服务器,就创建一个新的进程/线程为该客户端服务,客户端退出时再销毁该进程/线程,多任务并发模型也是实际工作中最为常用的服务端处理模型
模型特点
- 优点:能同时满足多个客户端长期占有服务端需求,可以处理各种请求。
- 缺点: 资源消耗较大
- 适用情况:客户端请求较复杂,需要长时间占有服务器。
创建流程
- 创建网络套接字
- 等待客户端连接
- 有客户端连接,则创建新的进程/线程具体处理客户端请求
- 主进程/线程继续等待处理其他客户端连接
- 如果客户端退出,则销毁对应的进程/线程
多进程并发模型示例
"""
基于多进程的网络并发模型
重点代码 !!
创建tcp套接字
等待客户端连接
有客户端连接,则创建新的进程具体处理客户端请求
父进程继续等待处理其他客户端连接
如果客户端退出,则销毁对应的进程
"""
from socket import *
from multiprocessing import Process
import sys
# 地址变量
HOST = "0.0.0.0"
PORT = 8888
ADDR = (HOST, PORT)
# 处理客户端具体请求
def handle(connfd):
while True:
data = connfd.recv(1024)
if not data:
break
print(data.decode())
connfd.close()
# 服务入口函数
def main():
# 创建tcp套接字
tcp_socket = socket()
tcp_socket.bind(ADDR)
tcp_socket.listen(5)
print("Listen the port %d"%PORT)
# 循环连接客户端
while True:
try:
connfd, addr = tcp_socket.accept()
print("Connect from", addr)
except KeyboardInterrupt:
tcp_socket.close()
sys.exit("服务结束")
# 创建进程 处理客户端请求
p = Process(target=handle, args=(connfd,),daemon=True)
p.start()
if __name__ == '__main__':
main()
"""
基于多线程的网络并发模型
重点代码 !!
思路: 网络构建 线程搭建 / 具体处理请求
"""
from socket import *
from threading import Thread
# 处理客户端具体请求
class Handle:
# 具体处理请求函数 (逻辑处理,数据处理)
def request(self, data):
print(data)
# 创建线程得到请求
class ThreadServer(Thread):
def __init__(self, connfd):
self.connfd = connfd
self.handle = Handle()
super().__init__(daemon=True)
# 接收客户端的请求
def run(self):
while True:
data = self.connfd.recv(1024).decode()
if not data:
break
self.handle.request(data)
self.connfd.close()
# 网络搭建
class ConcurrentServer:
"""
提供网络功能
"""
def __init__(self, *, host="", port=0):
self.host = host
self.port = port
self.address = (host, port)
self.sock = self.__create_socket()
def __create_socket(self):
tcp_socket = socket()
tcp_socket.bind(self.address)
return tcp_socket
# 启动服务 --> 准备连接客户端
def serve_forever(self):
self.sock.listen(5)
print("Listen the port %d" % self.port)
while True:
connfd, addr = self.sock.accept()
print("Connect from", addr)
# 创建线程
t = ThreadServer(connfd)
t.start()
if __name__ == '__main__':
server = ConcurrentServer(host="0.0.0.0", port=8888)
server.serve_forever() # 启动服务
最后一次更新于2022-12-06 14:02
0 条评论