部署站点

运行Sanic Web应用的方法已经在前面示例中见过多次,都是使用Sanic类的.run()方法来启动的。.run()方法支持以下命名参数来对启动过程进行配置。

  • host,Sanic服务监听的IP地址,默认为127.0.0.1。
  • port,Sanic服务监听的端口,默认为8000
  • debug,是否启动调试日志输出,如果开启会降低服务性能。
  • ssl,设定用于加密SSL的SSLContext实例。
  • sock,Sanic使用的用于建立连接的Unix Socket。
  • workers,Sanic的工作进程数量,默认是1。
  • loop,设定Sanic使用的异步事件循环,如果不指定则Sanic会自行建立一个。
  • protocol,设定Sanic的通讯协议,默认是HttpProtocol
  • access_log,是否启用请求日志输出,如果开启会大幅降低服务性能。

Sanic是一个ASGI兼容的框架,所以可以使用ASGI容器来承载,与Starlette相同,常用的ASGI容器有Daphne、uvicorn和hypercorn。例如使用uvicorn可以使用命令uvicorn app_package:app来启动。当使用ASGI方式启动Sanic时需要注意以下几点。

  1. WebSocket功能在使用Sanic自身启动时由websockets功能库来运行;但在ASGI模式下将由ASGI容器接管。
  2. 在ASGI模式下,Sanic的生命周期事件将被缩减为仅支持ASGI的启动和关闭事件,并受ASGI容器控制,推荐使用after_server_startbefore_server_stop两个事件来保证在所有环境下的兼容。
  3. Sanic的ASGI模式目前依旧是Beta版,将其用于生产模式要格外留意未来的版本变化。

当然Sanic还可以借助成熟的WSGI容器来启动,并在其中使用异步技术支持。但需要注意的是,在WSGI容器中异步只能是在一个工作进程中使用,性能相比同步框架有提高但不及在ASGI容器中使用异步的性能。Sanic在sanic.worker包中提供了WSGI容器用的工作进程类,在与Gunicorn搭配时可以使用以下命令启动。

gunicorn app_package:app --bind 0.0.0.0:8000 --worker-class sanic.worker.GunicornWorker

Sanic框架自己已经提供了异步事件循环,但是在与其他异步库同时使用时,常常需要共享事件循环,这就要用到Sanic的共享事件循环功能。共享事件循环可以参考以下示例来编写。

# 返回一个使用asyncio事件循环的服务
sanic_server = app.create_server(host="0.0.0.0", port=8000, return_asyncio_server=True)
# 获取事件循环,这个事件循环可以共享使用
loop = asyncio.get_event_loop()
# 将服务加入到事件循环
task = asyncio.encure_future(server)
# 启动事件循环
loop.run_forever()