服务器模型

基本的服务器模型:

并发:1、循环   

   2、并发模式

   3、IO多路复用

 

循环:1、单线程程序;

    2、循环接收连接或者请求,然后处理;处理后继续循环

循环服务器模型缺点:不能同时处理多个客户端的并行,不允许某个客户端长期占有服务器

       优点:结构比较简单,使用于UDP程序,要求处理请求可以快速完成

 

 

IO多路复用模型:通过同时监控多个IO,来达到IO并发的目的。

      缺点;单线程,不能长期阻塞;不适合处理大量cup占有高的程序

      优点;开销小,比较适合IO密集型的服务端程序

 

 

 并行服务器:每当有一个客户端连接请求时,就创建一个新的进程或者线程,处理客户端的                                请求,而主进程/主线程可以继续接受其他客户端的连接。

缺点:资源消耗比较大

优点:使用客户端需要长期占有服务器的情况

 

基于fork的多进程并发

1、创建套接字 绑定  监听

2、接受客户端请求

3、创建子进程,处理客户端请求,父进程继续准备接受新的客户端连接

4、客户端退出,销毁相应的子进程

from socket import *
import os,sys
import signal

#创建套接字

HOST=''
PORT=8888

def client_handler(c):
    try:
        print("子进程接收客户的请求",c.getpeername())
        while True:
            data=c.recv(1024).decode()
            if not data:
                break
            print(data)
            c.send(b"receive your message")
    except(KeyboardInterrupt,SystemExit):
        raise
    except Exception as e:
        print(e)
    c.close()
    sys.exit(0)#结束子进程



s=socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind((HOST,PORT))
s.listen(5)

print("父进程%d等待客户端链接"%os.getpid())
while True:
    try:
        c,addr=s.accept()
    except KeyboardInterrupt:
        raise
    except Exception as e:
        print(e)
        continue
    #为新的客户端创建进程,处理僵尸进程
    
    signal.signal(signal.SIGCHLD,signal.SIG_IGN)
    pid=os.fork()
    if pid<0:
        print("creating failuer")
        c.close()
        continue
    elif pid==0:
        s.close()
        #处理客户端请求
        client_handler(c)
    else:
        c.close()
        continue

 

 

posted @ 2019-07-16 17:17  sike8  阅读(194)  评论(0编辑  收藏  举报