httpserver

上一节我们说在tornado.web.Application.listen()(示例代码中的app.listen(8000))的方法中,创建了一个http服务器示例并绑定到给定端口,我们能不能自己动手来实现这一部分功能呢?

现在我们修改上一示例代码如下:

# coding:utf-8import tornado.web
import tornado.ioloop
import tornado.httpserver # 新引入httpserver模块class IndexHandler(tornado.web.RequestHandler):"""主路由处理类"""def get(self):"""对应http的get请求方式"""self.write("Hello Itcast!")if __name__ == "__main__":app = tornado.web.Application([(r"/", IndexHandler),])# ------------------------------# 我们修改这个部分# app.listen(8000)http_server = tornado.httpserver.HTTPServer(app) http_server.listen(8000)# ------------------------------tornado.ioloop.IOLoop.current().start()

在这一修改版本中,我们引入了tornado.httpserver模块,顾名思义,它就是tornado的HTTP服务器实现。

我们创建了一个HTTP服务器实例http_server,因为服务器要服务于我们刚刚建立的web应用,将接收到的客户端请求通过web应用中的路由映射表引导到对应的handler中,所以在构建http_server对象的时候需要传出web应用对象app。http_server.listen(8000)将服务器绑定到8000端口。

实际上一版代码中app.listen(8000)正是对这一过程的简写。

单进程与多进程

我们刚刚实现的都是单进程,可以通过命令来查看:

$ ps -ef | grep hello.py

我们也可以一次启动多个进程,修改上面的代码如下:

# coding:utf-8import tornado.web
import tornado.ioloop
import tornado.httpserver class IndexHandler(tornado.web.RequestHandler):"""主路由处理类"""def get(self):"""对应http的get请求方式"""self.write("Hello Itcast!")if __name__ == "__main__":app = tornado.web.Application([(r"/", IndexHandler),])http_server = tornado.httpserver.HTTPServer(app) # -----------修改----------------http_server.bind(8000)http_server.start(0)# ------------------------------tornado.ioloop.IOLoop.current().start()

http_server.bind(port)方法是将服务器绑定到指定端口。

http_server.start(num_processes=1)方法指定开启几个进程,参数num_processes默认值为1,即默认仅开启一个进程;如果num_processes为None或者<=0,则自动根据机器硬件的cpu核芯数创建同等数目的子进程;如果num_processes>0,则创建num_processes个子进程。

本例中,我们使用http_server.start(0),而我的虚拟机设定cpu核数为2,演示结果:

我们在前面写的http_server.listen(8000)实际上就等同于:

http_server.bind(8000)
http_server.start(1)

说明

1.关于app.listen()

app.listen()这个方法只能在单进程模式中使用。

对于app.listen()与手动创建HTTPServer实例

http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(8000)

这两种方式,建议大家先使用后者即创建HTTPServer实例的方式,因为其对于理解tornado web应用工作流程的完整性有帮助,便于大家记忆tornado开发的模块组成和程序结构;在熟练使用后,可以改为简写。

2.关于多进程

虽然tornado给我们提供了一次开启多个进程的方法,但是由于:

  • 每个子进程都会从父进程中复制一份IOLoop实例,如过在创建子进程前我们的代码动了IOLoop实例,那么会影响到每一个子进程,势必会干扰到子进程IOLoop的工作;
  • 所有进程是由一个命令一次开启的,也就无法做到在不停服务的情况下更新代码;
  • 所有进程共享同一个端口,想要分别单独监控每一个进程就很困难。

不建议使用这种多进程的方式,而是手动开启多个进程,并且绑定不同的端口

httpserver相关推荐

  1. 开源组件websocket-sharp中基于webapi的httpserver使用体验

    一.背景 因为需要做金蝶ERP的二次开发,金蝶ERP的开放性真是不错,但是二次开发金蝶一般使用引用BOS.dll的方式,这个dll对newtonsoft.json.dll这个库是强引用,必须要用4.0 ...

  2. 两款轻量级服务器 Http-server SimpleHTTPServer

    Http-server # 全局安装 npm install http-server -g# 启动服务# 禁用缓存 http-server -c-1# 在当前目录下的www启动服务器 http-ser ...

  3. 【IOS】ios之httpServer

    2019独角兽企业重金招聘Python工程师标准>>> 在使用百度音乐的时候   感觉到他的wifi传歌很实用   再手机上创建一个httpserver  然后通过pc的浏览器  进 ...

  4. 在Android上实现HttpServer

    本文讲的是在Android上实现HttpServer,在最近的项目中因为要用Android作为一个服务器去做一个实时接收数据的功能,所以这个时候就要去做一个Android本地的微型服务器. 那么此时我 ...

  5. http-server swagger-editor启动成功后,访问404的解决方法

    http-server swagger-editor启动成功后,访问404的解决方法 参考文章: (1)http-server swagger-editor启动成功后,访问404的解决方法 (2)ht ...

  6. java vertx http_佛系学习Vert.x之创建你的HttpServer

    大噶好,最近关注了一个叫Vert.x的东西 这是一个Logo 简单的说这是一个事件驱动的NIO框架,底层基于Netty.(这里我要上个测评)在 Web框架性能测试Round16中的各项指标表现还是很不 ...

  7. JAVA实现HTTPserver端

    用java socket实现了一个简单的httpserver, 能够处理GET, POST,以及带一个附件的multipart类型的POST.尽管中途遇到了非常多问题, 只是通过在论坛和几个高手交流了 ...

  8. windows7环境下的http-server的问题 排查

    刚才写了 windows7环境下的http-server的安装 记录.现在写一下问题,这个新鲜的. 前几天打开http-server时,出现了如下画面 尝试了好几次,也从vivaldi换成了chrom ...

  9. 【Node.js】http-server 实现目录浏览服务

    前言 node.js v12.18.2 用 node.js 实现目录浏览服务 前提,已经按照好Node.js http-server 官网:https://www.npmjs.com/package/ ...

  10. python实例32[简单的HttpServer]

    通常地我们要在不同平台间共享文件,samba,ftp,cifs,ntfs的设置都是有点复杂的, 我们可以使用python提供的httpserver来提供基于http方式跨平台的文件共享. 一 命令行启 ...

最新文章

  1. Spring抛出异常_自动装配
  2. php拍照从手机相册中选择,Android获取图片:拍照和从相册中选择
  3. Linux内存管理之mmap详解
  4. 使用 Async 和 Await 的异步编程
  5. 让S3c2410里拥有HIVE注册表的 全部步骤
  6. [转载] 快速入门(完整):Python实例100个(基于最新Python3.7版本)
  7. openCms安装技巧
  8. 计算机语言变成乱码怎么办,电脑文本文档出现乱码,教你电脑文本文档出现乱码怎么办...
  9. 从3D ToF到智能座舱系统方案,英飞凌如何赋能未来出行?
  10. ftp 连接失败。500 OOPS: cannot change directory:
  11. win10关闭自带杀毒软件Windows Defender的两种方法
  12. 指纹特征提取及描述(附Python代码)
  13. 在滴滴数据分析岗实习的8个月
  14. 八、chmod命令详细用法
  15. arduino实验日记
  16. linux服务器光衰,linux下怎么查看光模块光功率
  17. 【项目分享】使用 PointNet 进行点云分割
  18. Android 抖音爱心动画,Android自定义View实现抖音飘动红心效果
  19. 乐视网造假上市,法律后果有哪些?
  20. unity解压缩文件踩坑记录

热门文章

  1. Nginx设置Laravel项目中图片防盗链以及禁止地址栏直接访问图片
  2. mybatis3 配置文件解析
  3. html中在线预览pdf文件之pdf在线预览插件
  4. 数据库历险记(三) | 缓存框架的连环炮
  5. 监控WIN2003文件服务器上的文件夹和文件的复制、删除
  6. FusionCharts-堆栈图、xml格式、刷新数据、添加事件link、传参
  7. Linux如何生成列表
  8. Android 重写onBackPressed()方法 不执行问题
  9. 使用 Docker Stack 部署多服务集群
  10. Docker Compose配置springboot微服务项目