Sanic Listener – 监听器

Sanic教程 2019-04-03 22:46:47 阅读(34677) 评论(0)

Sanic提供的监听器(listener)允许我们在应用程序生命周期内的多个时间点运行一些代码。

Sanic Listener - 监听器

监听器分类

如果你想在Server开始时执行一些初始化代码,或者是在Server结束时执行一些清除代码,你就可以使用下面这些监听器:(和中间件一样,监听器的类型也是通过字符串参数来分类的)

  • before_server_start
  • after_server_start
  • before_server_stop
  • after_server_stop

这些中间件通过修饰器@app.listener修饰接受apploop参数的函数来实现。比如:

@app.listener('before_server_start')
async def setup_db(app, loop):
    app.db = await db_setup()

@app.listener('after_server_start')
async def notify_server_started(app, loop):
    print('Server successfully started!')

@app.listener('before_server_stop')
async def notify_server_stopping(app, loop):
    print('Server shutting down!')

@app.listener('after_server_stop')
async def close_db(app, loop):
    await app.db.close()

监听器注册方法:register_listener

除了使用修饰器还可以通过register_listener方法来注册监听器。这个方法的用处是,方便你在其它模块定义监视器函数,并在app所在文件进行注册。

# file: my_listener.py
async def setup_db(app, loop):
    app.db = await db_setup()
# file: app.py

from my_listener import setup_db

app = Sanic()
app.register_listener(setup_db, 'before_server_start')

Sanic add_task方法

如果你想安排一个后台任务在事件循环开始后执行,Sanic提供了add_task方法来帮你轻松实现。

async def notify_server_started_after_five_seconds():
    await asyncio.sleep(5)
    print('Server successfully started!')

app.add_task(notify_server_started_after_five_seconds())

Sanic将试图自动注入app对象,可以作为一个参数传递给任务函数:

async def notify_server_started_after_five_seconds(app):
    await asyncio.sleep(5)
    print('Server successfully started!')

app.add_task(notify_server_started_after_five_seconds)

或者可以显式地传递app可以起到同样的效果:

async def notify_server_started_after_five_seconds(app):
    await asyncio.sleep(5)
    print('Server successfully started!')

app.add_task(notify_server_started_after_five_seconds(app))

猿人学banner宣传图

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。

***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.con 原创,没有猿人学授权,请勿以任何形式转载。***

说点什么吧...