读书笔记_python网络编程3_(7)

Python71

7.0.网络服务的编写需要面对两个挑战:

只使用一个小节的篇幅来介绍部署的问题,把重点放在如何构建网络Serv软件上。
可将网络Serv分为3大类:
1)单线程Serv(类似于UDP和TCP),着重讨论局限性:同一时刻只能为一个Cli提供服务,其他所有Cli都进行等待,即使为该Cli服务,OS的CPU也可能处于近乎空闲的状态。有两个截然相反的解决方案:
1.1)使用多个threading/processing,每个thd/prs内都运行一个单thd-Serv;
1.2)在自己的代码中使用异步网络操作来支持多路复用,而不直接使用OS提供的多路复用。
最新的asyncio模块只支持Py3

7.1. 浅谈部署

可能会把网络Serv部署到单台机器上,也可能部署到多台机器上

1)旧式:为每个Serv程序都编写服务所提供的所有功能:通过两次fork()创建一个Unix守护进程(将自己注册一个Win服务),安排进行系统级的日志操作,支持配置文件及提供启动、关闭、重启的相关机制。可以使用三方库/自己实现来完成Serv程序的编写。
2)"十二要素应用"的宣言提出广为流行,提倡只实现Serv程序必备功能的最小集合。将每个服务实现为普通的前台程序,而不是守护进程。程序从环境变量(Py中sys.environ字典)而不是系统级的配置文件中获取所需的配置选项。通过环境变量中指定的选项,连接到任意的后端服务,且直接将日志信息输出到屏幕/直接使用print()函数。该方法通过打开且监听环境配置指定的任意端口来接收网络请求。这种风格编写的服务很易于开发者直接在shell中运行以进行测试。只要简单地在程序外部使用适当的部署框架,就能将程序改为守护进程/系统服务,也可将其部署到网络Serv集群中。
如,部署框架可从一个集中式的配置服务中,获取环境变量的设置,可将程序的标准输出流和错误流连接到一个远程日志Serv,也可在服务停止响应/暂停时重启服务。程序本身不知道这一切,仍会像平常一样,直接输出到标准输出流,程序员可保证该Serv代码在生产环境下的运行表现与开发环境相同。

某些提供商允许直接提交Py代码,另一些则希望将代码、Py解释器及所有需要的依赖包打入一个容器内(Docker等)。无需在单个服务中提供多个功能,服务中所有冗余和重复都由平台来处理。

7.2.示例使用最简单的TCP协议作为说明。Cli可以询问3个问题,3个问题都以纯文本的ASCII字符表示。发出请求的问题后,Cli将等待Serv的应答。和HTTP协议一样,只要socket保持打开,Cli发起问题请求的次数没有限制。Cli不再发起请求后,无需发出任何警告即可将连接关闭。每个问题的结尾用ASCII的问号表示结束。

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长