python tornado开启多进程的几种方法
作者:终成一个大象 发布时间:2021-09-18 22:28:17
以下各种方式仅供参考,本人亲测只有官方提供的方式比较靠谱。
1. 使用多个进程启动多个Tornado实例
import tornado.httpserver
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
if __name__ == "__main__":
app = tornado.web.Application([(r"/", MainHandler)])
server = tornado.httpserver.HTTPServer(app)
server.bind(8888)
server.start(0) # 0 表示启动与CPU数量相同的进程
tornado.ioloop.IOLoop.current().start()
2. 使用tornado.process.fork_processes()方法启动多个进程
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.process
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
if __name__ == "__main__":
app = tornado.web.Application([(r"/", MainHandler)])
server = tornado.httpserver.HTTPServer(app)
server.bind(8888)
tornado.process.fork_processes(2) #
tornado.process.fork_processes(2) 表示启动2个进程,每个进程都会调用 server.start(0) 来启动Tornado实例。注意:在使用 tornado.process.fork_processes() 启动多进程时,需要在 if __name__ == "__main__": 中调用该方法,否则会出现错误。
完整代码如下:
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.process
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
if __name__ == "__main__":
app = tornado.web.Application([(r"/", MainHandler)])
server = tornado.httpserver.HTTPServer(app)
server.bind(8888)
tornado.process.fork_processes(2)
server.start(0)
tornado.ioloop.IOLoop.current().start()
3.使用标准库中的multiprocessing
除了以上提到的方式,还可以使用Python标准库中的multiprocessing模块来启动多个Tornado进程,具体实现可以参考以下示例代码:
import tornado.httpserver
import tornado.ioloop
import tornado.web
from multiprocessing import Process
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def start_tornado():
app = tornado.web.Application([(r"/", MainHandler)])
server = tornado.httpserver.HTTPServer(app)
server.listen(8888)
tornado.ioloop.IOLoop.current().start()
if __name__ == "__main__":
processes = []
for i in range(2):
p = Process(target=start_tornado)
p.start()
processes.append(p)
for p in processes:
p.join()
这段代码会启动两个Tornado进程,每个进程都会监听8888端口,并使用单独的进程处理请求。
4.使用第三方模块gevent
还有一个方式是使用第三方模块gevent来实现协程并发,配合Tornado使用可以达到类似多进程的效果,但是只使用一个进程。示例代码如下:
import gevent.monkey
gevent.monkey.patch_all()
import tornado.httpserver
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
if __name__ == "__main__":
app = tornado.web.Application([(r"/", MainHandler)])
server = tornado.httpserver.HTTPServer(app)
server.bind(8888)
server.start(0) # 0 表示启动与CPU数量相同的进程
tornado.ioloop.IOLoop.current().start()
在上面的代码中,我们引入了gevent.monkey模块,使用patch_all()方法将所有的阻塞式IO替换为非阻塞式IO,然后在启动Tornado时,使用server.start(0)方法启动与CPU数量
5.使用官方提供方式
listen:单进程:
async def main():
server = HTTPServer()
server.listen(8888)
await asyncio.Event.wait()
asyncio.run(main())
在许多情况下,tornado.web.Application.listen可用于避免明确创建HTTPServer的需要。
虽然此示例不会单独创建多个进程,但当thereusereuse_port=True参数传递给listen()时,您可以多次运行程序以创建多进程服务。
add_sockets:多过程:
sockets = bind_sockets(8888)
tornado.process.fork_processes(0)
async def post_fork_main():
server = HTTPServer()
server.add_sockets(sockets)
await asyncio.Event().wait()
asyncio.run(post_fork_main())
add_sockets接口更复杂,但它可以与tornado.process.fork_processes一起使用,以运行从单父分支的所有工作进程的多进程服务。如果您想以bind_sockets以外的某种方式创建监听套接字,add_sockets也可以在单进程服务器中使用。
请注意,使用此模式时,触及事件循环的任何东西都不能在fork_processes之前运行。
bind/start:简单不建议使用的多进程:
server = HTTPServer()
server.bind(8888)
server.start(0) # Forks multiple sub-processes
IOLoop.current().start()
此模式被弃用,因为它需要自Python 3.10以来被弃用的asyncio模块中的接口。在start方法中创建多个进程的支持将在的未来版本中删除。
此模式就是文中所说的第一种模式,单从官方文档来看,这种方式已经被抛弃,本人在实测中也发现存在问题:无法完全关闭fork的子进程。
6.使用supervisor
使用supervisor等进程管理工具来管理多个Tornado进程,这种方式可以更加方便地监控和管理多个进程,不过需要额外的配置和安装进程管理工具。
来源:https://blog.csdn.net/Martin_chen2/article/details/130095961
猜你喜欢
- 使用cookie来判断来访者身份,是否是首次登陆, asp代码实例如下:< %@ LANGUAGE=&q
- 在“按需加载”的需求中,我们经常会判断当脚本加载完成时,返回一个回调函数,那如何去判断脚本的加载完成呢?我们可以对加载的 JS 对象使用 o
- 一,分析代码运行时间第1式,测算代码运行时间平凡方法快捷方法(jupyter环境)第2式,测算代码多次运行平均时间平凡方法快捷方法(jupy
- go设置GOROOT和GOPATHgo 里面有两个非常重要的环境变量 GOROOT 和 GOPATH,其中 GOROOT 是安装 go 的路
- goto语句在Go编程语言中的goto语句提供无条件跳转从跳转到标记声明的功能。注意:使用goto语句是高度劝阻的在任何编程语言,因为它使得
- 由于可将 Microsoft? SQL Server? 2000 设置为包含一个或多个命名实例和一个默认实例(也可无),所以要用新命名规则来
- 大家都知道,在SQL脚本中设置多字段做关键字相对比较简单,例:primary key(id1,id2) ,但用脚本建数据库就比较麻烦了。那么
- python微信跳一跳,前言 这是python玩跳一跳系列博文中一篇,主要内容是用颜色识别的方法来进行跳跳小人的定位。颜色识别通过观察,我们
- 1.int,float相互转换例1:int转float使用float(int)float转int使用int(float)# coding:u
- ubuntu 系统自带的 python 有多个版本,使用时难免会遇到环境变量出错,特别是当自动化运行脚本的时候。特别是近一个月来,实验室的小
- 前言本文主要给大家介绍了利用django-suit模板在管理后台添加自定义的菜单和自定义的页面、设置访问权限的相关内容,分享出来供大家参考学
- 我们大致会在下列几种情况下用到: 一、文件操作(FileSystemObject)<%@ IMPORT
- Mootools 1.2手风琴(Accordion)教程原文地址:30 Days of Mootools 1.2 Tutoria
- mysql数据库数据表和数据表关联--问题??用户数据表user 字词作品数据表article 短信 message外键ID 主键,之间的关
- 公司网站后台使用的eWebEditor来添加发布新闻之类的,但把电脑的IE升级到8之后一直没办法添加附件之类的,症状就是在点击编辑器按钮时就
- 需求背景公司前端使用 Highcharts 构建图表,图表的图例支持点击显示或隐藏相应的指标。现在有需求后端需要存储用户在前端点击后显示图表
- http通过StreamingHttpResponse完成连续的数据传输长链接问题http服务之间传递结果流一个由flask封装起来的算法,
- 提叻一个代码段,要人帮助解释一下。代码如下:declare type t_indexby is ta
- 现在IE7已经推出一段时间并且渗透到用户当中,不用等太久我们就可以在页面上使用更高级的CSS。两个最有用的项目将是 Child子和Adjac
- 在获得SA密码后,往往因为服务器管理者或”前人”将net.exe和net1.exe被限制使用,无法添