网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月16日漏签0天
tornado吧 关注:1,221贴子:1,018
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 8回复贴,共1页
<<返回tornado吧
>0< 加载中...

Tornado学习心得-第八期:自定义Application子类实现全局级资源

  • 只看楼主
  • 收藏

  • 回复
  • 将就将就
  • 活跃吧友
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
定义Application类的子类,在子类里添加属性。
.
1. 自定义ShopApplication类,继承Application类(不要忘记在ShopApplication.__init__里调用super().__init__)
.
class ShopApplication(Application):
  def __init__(self, handlers, **settings):
    self.mysql_conn = None
    self.redis_client = None
    self.mongo_client = None
.
    self.init_db()
.
    super().__init__(handlers, **settings)
.
  def init_db(self):
    // initialize db connections
.
2. 使用ShopApplication类提供服务
.
app = ShopApplication(urlmap, debug=True)
app.listen(8080)
IOLoop.current().start()
.
.
.
总结:
1. 由于Tornado运行期间Application类是单例的,在整个Web应用的生命周期范围内都存在
2. RequestHandler类持有对Application类的引用,在Handler函数内部可以调用self.application得到Application类的实例,可通过self.application.mysql_conn、self.application.redis_client、self.application.mongo_client这些属性


  • 将就将就
  • 活跃吧友
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
向自定义的Application类添加释放单例资源的逻辑
.
class ShopApplication(Application):
  def on_close(self):
    self.close_db()
.
  def close_db(self):
    // close db connections
.
def on_sigterm():
  global app
  app.on_close()
.
signal.signal(signal.SIGTERM, on_sigterm)
.
.
说明:
1. Tornado不提供注册服务停止时的资源释放代码的特性
2. 开发者自行通过signal模块提供的注册信号处理函数机制,注册对SIGTERM信号的处理函数,在处理函数内获取app对象,进而调用app.on_close函数
3. app.on_close函数内部调用关闭Application级资源的逻辑


2025-12-16 03:59:43
广告
不感兴趣
开通SVIP免广告
  • 将就将就
  • 活跃吧友
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
总结
.
1. 自定义Application类的子类
2. 子类的__init__函数里执行自定义的Application级资源的初始化逻辑(一般是把处理化逻辑单独包装为一个init_db之类的函数,在__init__函数内调用init_db函数)
3. 子类的on_close函数里执行自定义的Application级资源的清理逻辑(一般是把处理化逻辑单独包装为一个close_db之类的函数,在on_close函数内调用close_db函数)
4. 定义全局的信号处理函数on_sigterm,它内部调用app.on_close函数
5. 调用signal.signal(signal.SIGTERM, on_sigterm)把on_sigterm注册为对SIGTERM信号的响应函数


  • 将就将就
  • 活跃吧友
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
华丽的分隔线


  • 将就将就
  • 活跃吧友
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
本章节里复习到的Python小知识
.
1. 内置的Application类接收很多参数
2. 当自定义Application类继承Application类又不想把Application类的所有参数都列出时,可以使自定义Application类的__init__函数接收**settings参数,然后在__init__函数体内调用super().__init__(**settings)甩锅给父类的__init__函数
3. super函数不需要接收参数
4. 走super()调用父类构造函数__init__时,不需要把self作为__init__函数的第一个参数。即super().__init__(**settings)
5. 走Application调用父类构造函数__init__时,需要把self作为__init__函数的第一个参数。即Application.__init__(self, **settings)
6. 注册信号处理函数靠的是signal模块的signal函数,即signal.signal


  • 将就将就
  • 活跃吧友
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
结帖咯


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 8回复贴,共1页
<<返回tornado吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示