Tornado 在知乎中被广泛使用。当你用Chrome打开知乎网页版,使用开发者工具仔细观察网络中的请求时,你会发现有一个特殊的请求,状态码为101,它利用浏览器的websocket技术建立了一个长与后端服务器连接,接收服务器主动推送的通知消息。这里的后端服务器使用tornado 服务器。 Tornado服务器除了提供websocket服务外,还可以提供长连接服务、HTTP短链接服务、UDP服务等。Tornado服务器是facebook开源的,广泛用于掌上阅读的后端。
这么强大的tornado框架如何使用?本文将带领读者逐步深入学习如何使用tornado作为web服务器的基础。
1。
进口
龙卷风.ioloop
2。
进口
龙卷风网站
4。
班级
主处理器
5。
定义
得到
自我
):
6。
自我.写(
“你好,世界”)
8。
定义
制作_app
():
9。
10。
r"/", MainHandler),
11。
])
13。
如果 __name__ u003du003d
“__main__”:
14。
应用程序 u003d 制作_app()
15。
应用程序。听(
16。
一个普通的 Tornado Web 服务器通常由四个组件组成。
1、ioloop实例,即全局tornado事件循环,是服务器的核心引擎。在示例中,龙卷风 ioloop。 IOL 循环。 Current() 是默认的 tornado ioloop 实例。
4、路由表,将指定的url规则与handler连接起来,形成路由映射表。当请求到达时,根据请求的访问url查询路由映射表,找到对应的service handler。
这四个组件之间的关系是一个ioloop包含多个app(管理多个服务端口),一个app包含一个路由表,一个路由表包含多个handler。 ioloop是服务引擎的核心。它是引擎,负责接收和响应客户端请求,驱动业务处理程序的操作,并在服务器内部执行计划任务。
同一个 ioloop 实例在单线程环境中运行。
让我们编写一个提供阶乘服务的普通 Web 服务器。那就是帮助我们计算n!的价值。服务器会提供阶乘缓存,计算出来的缓存会被保存。下次无需重新计算。使用Python的好处是不用担心阶乘的计算结果会溢出。 Python 整数可以是无限的。
1。
2。
进口
龙卷风.ioloop
3。
进口
龙卷风网站
6。
班级
FactorialService
对象
):
8。
定义
__初始化__
自我
):
9。
11。
定义
计算
自我
, n):
12。
如果 n
自我缓存:
13。
返回
14。
年代 u003d
15。
为我
范围(
1, n):
16。
s *u003d 我
17。
18。
返回
21。
班级
因子处理程序
23。
服务 u003d FactorialService()
25。
定义
得到
自我
):
26。
n u003d
整数(
"n"))
27。
自我.写(
str(
30。
定义
制作_app
():
31。
32。
r"/fact", FactorialHandler),
33。
])
35。
如果 __name__ u003du003d
“__main__”:
36。
应用程序 u003d 制作_app()
37。
应用程序。听(
38。
使用 Redis
--
上面的例子是将缓存存储在本地内存中。如果更改一个端口和一个阶乘服务通过这个新端口访问它,则需要为每个 n 重新计算它,因为本地内存无法跨进程和机器共享。
因此,在本例中,我们将使用 Redis 来缓存计算结果,从而完全避免重复计算。另外,我们不会返回纯文本,而是返回一个 json,并在响应中添加一个字段名称来说明这个计算是来自缓存还是事实。此外,我们提供默认参数。如果客户端不提供N,则默认为nu003d1。
1。
进口
json
2。
进口
雷迪斯
3。
进口
龙卷风.ioloop
4。
进口
龙卷风网站
7。
班级
FactorialService
对象
):
9。
定义
__初始化__
自我
):
10。
“本地主机”,
11。
“阶乘”
13。
定义
计算
自我
, n):
14。
年代 u003d
str(n))
15。
如果是:
16。
返回
整数,
17。
年代 u003d
18。
为我
范围(
1, n):
19。
s *u003d 我
20。
str(n),
str(s))
21。
返回 s,
错误的
24。
班级
因子处理程序
26。
服务 u003d FactorialService()
28。
定义
得到
自我
):
29。
n u003d
整数(
"n")
30。
事实上,缓存 u003d
31。
结果 u003d {
32。
"n": n,
33。
“事实”:事实,
34。
“缓存”:缓存
35。
36。
"内容类型",
"应用程序/json; charsetu003dUTF-8")
37。
40。
定义
制作_app
():
41。
42。
r"/fact", FactorialHandler),
43。
])
45。
如果 __name__ u003du003d
“__main__”:
46。
应用程序 u003d 制作_app()
47。
应用程序。听(
48。
{“缓存”:假,“事实”:608281864034267560872252163321295376887552831379210240000000000,“n”:50}
,再次刷新。浏览器输出 {"cached": true, "fact": 6082818640342675608722521633212953768875528313792102400000000, "n": 50}。可以看到缓存字段被编程为true到false,说明缓存确实保存了计算结果。让我们重新开始这个过程,
再次访问连接并观察浏览器输出。可以发现缓存的结果还是等于true。这表明缓存结果不再存储在本地内存中。
PI计算服务
--
接下来,我们将添加一个服务来计算 PI。有许多计算 PI 的公式。我们把它当作最简单的一种。
我们在服务中提供了一个参数 n 作为 PI 的准确度指标。 n 越大,PI 计算越准确。同样,我们也将计算结果缓存在 Redis 服务器中,避免重复计算。
1。
2。
进口
json
3。
进口
数学
4。
进口
雷迪斯
5。
进口
龙卷风.ioloop
6。
进口
龙卷风网站
8。
班级
FactorialService
对象
):
10。
定义
__初始化__
自我
,缓存):
11。
12。
“阶乘”
14。
定义
计算
自我
, n):
15。
年代 u003d
str(n))
16。
如果是:
17。
返回
整数,
18。
年代 u003d
19。
为我
范围(
1, n):
20。
s *u003d 我
21。
str(n),
str(s))
22。
返回 s,
错误的
24。
班级
Pi服务
对象
):
26。
定义
__初始化__
自我
,缓存):
27。
28。
“小便”
30。
定义
计算
自我
, n):
31。
年代 u003d
str(n))
32。
如果是:
33。
返回
浮点数,
34。
年代 u003d
0.0
35。
为我
范围(n):
36。
小号 +u003d
1.0/(
2*i+
1)/(
2*i+
37。
s u003d 数学.sqrt(s*
38。
str(n),
str(s))
39。
返回 s,
错误的
41。
班级
因子处理程序
43。
定义
初始化
自我
, 阶乘):
44。
46。
定义
得到
自我
):
47。
n u003d
整数(
"n")
48。
事实上,缓存 u003d
49。
结果 u003d {
50。
"n": n,
51。
“事实”:事实,
52。
“缓存”:缓存
53。
54。
"内容类型",
"应用程序/json; charsetu003dUTF-8")
55。
57。
班级
PiHandler
59。
定义
初始化
自我
, π):
60。
自我.pi u003d pi
62。
定义
得到
自我
):
63。
n u003d
整数(
"n")
64。
pi,缓存 u003d
65。
结果 u003d {
66。
"n": n,
67。
“圆周率”:圆周率,
68。
“缓存”:缓存
69。
70。
"内容类型",
"应用程序/json; charsetu003dUTF-8")
71。
73。
定义
制作_app
():
74。
“本地主机”,
75。
阶乘 u003d 阶乘服务(缓存)
76。
pi u003d PiService(缓存)
77。
78。
r"/fact", FactorialHandler, {
"阶乘": 阶乘}),
79。
r"/pi", PiHandler, {
"pi":pi}),
80。
])
82。
如果 __name__ u003du003d
“__main__”:
83。
应用程序 u003d 制作_app()
84。
应用程序。听(
85。
更多 Python 视频、源代码和资料免费提供
Python社区为您提供最前沿的新闻资讯和知识内容
更多推荐
求助!为什么用InsCode部署会出现无限重定向?
如何重塑熊猫。系列
在哪里可以找到有关 Keras 中默认权重初始化器的文档? [复制]