在两个本地端口运行Tornado服务失败问题排查求助
问题分析与修复方案
核心问题排查
- 未导入并解析Tornado配置:代码中使用
define和options但未导入tornado.options模块,也未调用配置解析方法,导致端口变量无法被识别。 - 子进程未启动IOLoop:Tornado的
listen()仅完成端口绑定,必须启动IOLoop才能处理请求,原代码中子进程启动后立即退出,服务未真正运行。 - 多进程文件写入冲突:两个进程同时写入
test.jl,会出现数据覆盖问题。 - 冗余无效代码:
app.settings语句无实际作用,属于无效代码。
修复后的完整代码
import json import tornado.httpclient import tornado.web import tornado.httpserver import tornado.gen from tornado.options import define, options, parse_command_line import logging import jsonlines from multiprocessing import Process import os class RequestFour(tornado.web.RequestHandler): async def get(self): client = tornado.httpclient.AsyncHTTPClient() response = await client.fetch('https://www.scrapethissite.com/pages/ajax-javascript/?ajax=true&year=2015') body = json.loads(response.body) # 用进程ID生成独立文件,避免多进程覆盖 file_path = f"test_{os.getpid()}.jl" with jsonlines.open(file_path, 'w') as f: f.write(body[0]) self.write(body[0]) self.finish() def run_server(port): parse_command_line() app = tornado.web.Application(handlers=[(r'/', RequestFour)]) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(port) # 启动IOLoop维持服务运行 tornado.ioloop.IOLoop.current().start() if __name__ == '__main__': # 主进程统一定义端口配置 define('port1', default=7010, help="run on port 7010", type=int) define('port2', default=6010, help="run on port 6010", type=int) parse_command_line() p1 = Process(target=run_server, args=(options.port1,)) p2 = Process(target=run_server, args=(options.port2,)) p1.start() p2.start() p1.join() p2.join()
关键修改说明
- 配置模块处理:添加
tornado.options导入,主进程定义端口配置并解析,子进程同步解析确保变量可用。 - 统一服务逻辑:将双端口服务合并为
run_server函数,通过参数传递端口,消除代码冗余。 - 启动IOLoop:在子进程中启动IOLoop,保证服务持续运行处理请求。
- 文件写入优化:基于进程ID生成独立文件名,解决多进程数据覆盖问题。
- 规范命名:将类名
requestFour改为RequestFour,符合Python命名规范。
内容的提问来源于stack exchange,提问作者Dollar Tune-bill
相关产品推荐
相关产品推荐

