美文网首页
03 python 服务器模块SocketServer实现分叉(

03 python 服务器模块SocketServer实现分叉(

作者: _Mirage | 来源:发表于2020-07-17 07:53 被阅读0次

分叉是一个UNIX术语。对进程(运行的程序)进行分叉时,基本上是复制它,这样得到的两个进程都将从当前位置开始继续往下执行,且每个进程都有自己的内存副本(变量等)。原来的进程为父进程,复制的进程为子进程。

在分叉服务器中,对于每个客户端连接,都将通过分叉创建一个子进程。父进程继续监听新连接,而子进程负责对客户端请求进行处理。客户端请求完毕后,子进程直接退出。由于分叉出来的进程并行的运行,因此客户端无需等待。

缺点:分叉占用资源较多(每个分叉出来的进程都必须有自己的内存)。 ---> 可以用线程来代替。

现代操作系统(windows不支持分叉操作)中,分叉的速度其实非常快,较新的硬件能够很好的应付其资源消耗。分叉不需要处理线程麻烦的共享内存同步等问题,在某些情况下是很好的选择。

基于SocketServer的简易分叉服务器:

from socketserver import TCPServer, ForkingMixIn, StreamRequestHandler


# windows不支持分叉....因此socketserver包下面默认没有ForkingMixIn模块(但是可在linux等系统上正常运行)
class Server(ForkingMixIn, TCPServer):
    pass


class Handler(StreamRequestHandler):
    # handle方法专门用于处理客户端的请求
    def handle(self):
        addr = self.request.getpeername()
        print('来自{}的连接请求..'.format(addr))
        self.wfile.write(bytes('谢谢你的连接...', 'utf-8'))


# 不用默认的TCPserver, 而是用人为利用ForkingMixIn和TCPServer共同创建的子类来实例化服务器对象(简便)
#   IP地址本机, 端口1234, 处理客户端请求的对象: Handler
server = Server(('', 1234), Handler)
print('等待客户端连接中....')
server.serve_forever()

客户端: 使用socket简易客户端即可完成测试。

相关文章

网友评论

      本文标题:03 python 服务器模块SocketServer实现分叉(

      本文链接:https://www.haomeiwen.com/subject/cpswhktx.html