tornado的多进程模式如何实现共享同一个ioloop?

发布于 2022-09-06 07:24:08 字数 339 浏览 15 评论 0

启动方式大概如下

app = tornado.web.Application(router.url_map, **settings)
server = tornado.httpserver.HTTPServer(app)
server.bind(options.port)
server.start(10)
tornado.ioloop.IOLoop.instance().start()

这里启动了10个子进程去并行,每个进程的资源是隔离的, 实际测试中发现不同进程打印出来的ioloop实例地址一样的

在代码中也没看见有进程中的共享内存等操作, 所以想问是怎么实现共享同一个ioloop的?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

旧城烟雨 2022-09-13 07:24:08
sockets = tornado.netutil.bind_sockets(8888)
tornado.process.fork_processes(0)
server = HTTPServer(app)
server.add_sockets(sockets)
IOLoop.current().start()
迷爱 2022-09-13 07:24:08

实际测试中发现不同进程打印出来的ioloop实例地址一样的

应该是你测试有问题。把代码粘出来。或者,你先自己确认一下,是不是真的“不同进程”。

当爱已成负担 2022-09-13 07:24:08

请问这个问题找到原因了吗?我也碰到了,但是在源码里没找出来原因。

环境 tornado-5.0.2 python-3.6.5 系统:Linux-3.10.0-693.el7.x86_64

测试代码:

import tornado.web
import tornado.ioloop
import tornado.httpserver
import os
import time
app = tornado.web.Application(debug=False)
http_server = tornado.httpserver.HTTPServer(app)
http_server.bind(9000, 'localhost')
print("main pid: %d" % os.getpid())
http_server.start(num_processes=0)
ioloop = tornado.ioloop.IOLoop.current()
ioloop.mytask = os.getpid()
print("pid:  %d, ioloop_instance: %d" % (os.getpid(), id(ioloop)))
tornado.ioloop.IOLoop.current().start()

执行结果
图片描述

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文