python 网络服务器框架_Python网络编程笔记(六):服务器架构

网络服务面临两个基本问题:

编码:编写出正确处理请求和响应的代码。

部署:使用守护进程,活动日志持久化存储,防止各种失败或者在失败后立即重启。

部署

服务地址:硬编码IP、DNS解析、在服务前端配置负载均衡器。

两种部署思路:

每个服务器程序编写服务的所有功能:成为unix守护进程或者windows服务,安排系统级的日志,支持配置文件,提供启动、关闭、重启功能。这些功能不一定自己编写,也使用第三方库。

服务器程序只实现最小功能,只是一个普通的前台程序,而不是守护进程。一般重环境变量中获得配置。不过可以添加框架使思路二变成思路一的守护进程。Paas服务即是如此,重复的功能平台方搞定。

推荐supervisord

单线程服务器

以一个简单的TCP协议为例:

即使 listen()的参数大于0,第一个对话未完成时,第二个对话仍旧会在队列中,只是减少了切换时建立连接的时间。

缺点:

拒绝服务攻击

严重浪费CPU资源,因为在等待客户端时,服务端什么都不能做。

tips:性能测试使用 trace 模块:python -m trace -tg --ignore-dir=/usr main.py

多线程与多进程服务器

利用操作系统的多路复用。可以创建多个共享相同内存的线程,或者完全独立的进程。

优点:简单,复用单线程代码。

缺点:

服务器同时通信的客户端数量受OS限制。

即使某个客户端空闲或者运行缓慢,仍会独占线程或进程。

大量客户端时,上下文切换成本很大。

模块:threading 和 multiprocessing

异步服务器

利用服务端向客户端发送响应后等待下一次响应的时间。

异步(asyhchronous),表示从不停下来,区别于同步(synchronized)

操作系统级异步

传统的 select(), 后续 Linux 的 poll() 和 BSD 的 epoll()

看下面这段简单的异步代码:精髓在于自己设计数据结构保存客户端状态,而不依赖操作系统的上下文切换。

#!/usr/bin/env python3

# Foundations of Python Network Programming, Third Edition

# https://github.com/brandon-rhodes/fopnp/blob/m/py3/chapter07/srv_async.py

# Asynchronous I/O driven directly by the poll() system call.

# zen_utils 是自己编写的处理各种业务逻辑的包<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值