我的编程空间,编程开发者的网络收藏夹
学习永远不晚

pythontornado开启多进程的几种方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

pythontornado开启多进程的几种方法

以下各种方式仅供参考,本人亲测只有官方提供的方式比较靠谱。

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进程,这种方式可以更加方便地监控和管理多个进程,不过需要额外的配置和安装进程管理工具。

到此这篇关于python tornado开启多进程的几种方法的文章就介绍到这了,更多相关python tornado多进程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

pythontornado开启多进程的几种方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

pythontornado开启多进程的几种方法

本文主要介绍了pythontornado开启多进程的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-16

Linux启动新进程的几种方法及比较

有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及它们之间的区别。 一、system
2022-06-04

Java 开启多线程常见的4种方法

Java 开启多线程常见的4种方法如下:1. 继承 Thread 类:创建一个继承自 Thread 类的子类,并重写 run() 方法。然后通过创建该子类的对象来开启线程。```javaclass MyThread extends Thre
2023-08-14

python tornado开启多进程的方法有哪些

这篇文章主要讲解了“python tornado开启多进程的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python tornado开启多进程的方法有哪些”吧!1. 使用多个进程
2023-07-06

java 实现开启异步线程的几种方式

在Java中,有多种方式可以实现异步线程以避免在主线程中执行耗时操作导致界面卡顿的问题。以下是几种常用的方式: 使用Thread类:可以使用Thread类来创建一个新的线程,并在其run()方法中执行耗时操作。例如: new Thread(
2023-08-17

Linux启动新进程的三种方法

程序中,我们有时需要启动一个新的进程,来完成其他的工作。 下面介绍了三种实现方法,以及这三种方法之间的区别。 1.system函数-调用shell进程,开启新进程 system函数,是通过启动shell进程,然后执行shell命令进程。 原
2022-06-04

Android开发之设置开机自动启动的几种方法

Android开发之设置开机自动启动的几种方法方法一:
2023-05-30

python进程间通信的方法有哪几种

Python进程间通信的方法主要有以下几种:管道(Pipe):使用multiprocessing模块中的Pipe()函数创建管道,实现进程间的通信。一个进程可以写入数据到管道,另一个进程可以从管道中读取数据。队列(Queue):使用mult
python进程间通信的方法有哪几种
2024-04-09

spring启动加载程序的几种方法介绍

关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种:第一种:通过注解@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作import javax.annotatio
2023-05-31

Windows7系统下开启无线的多种方法

适用范围:WIN7 无线 开启知识点分析:Windows 7系统下无线开启的方法。操作步骤:1. 按WIN+X,我们需要打开移动中心,先看一下无线的状态,如图:第一种是关www.cppcns.com闭状态,表示无线驱动和服务都是正常的。需要
2023-06-06

java 多线程的几种实现方法总结

java 多线程的几种实现方法总结1.多线程有几种实现方法同步有几种实现方法多线程有两种实现方法,分别是继承Thread类与实现Runnable接口同步的实现方面有两种,分别是synchronized,wait与notifywait():使
2023-05-30

python实现多线程的方法有哪几种

在Python中,有多种方法可以实现多线程,其中最常用的有以下几种:使用 threading 模块:Python的 threading 模块提供了多线程编程的支持,可以通过创建 Thread 对象来实现多线程。可以通过继承 Thread 类
python实现多线程的方法有哪几种
2024-03-08

Python部署web开发程序的几种方法

1、fastcgi ,通过flup模块来支持,在nginx里对应的配置指令是 fastcgi_pass 2、http,nginx使用proxy_pass转发,这个要求后端appplication必须内置一个能处理高并发的http serve
2022-06-04

win10开启远程桌面的两种方法

编程学习网:远程桌面连接功能是IP地址使用到最强大的功能,远程桌面连接是指当离开电脑时使用另一能电脑控制本电脑,对被控制电脑进行操作。
win10开启远程桌面的两种方法
2024-04-23

Python制作进度条的几种方法

如果你之前没用过进度条,八成是觉得它会增加不必要的复杂性或者很难维护,其实不然。要加一个进度条其实只需要几行代码,快跟随小编一起学习学习吧
2022-12-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录