部署站点
运行Sanic Web应用的方法已经在前面示例中见过多次,都是使用Sanic
类的.run()
方法来启动的。.run()
方法支持以下命名参数来对启动过程进行配置。
host
,Sanic服务监听的IP地址,默认为127.0.0.1。port
,Sanic服务监听的端口,默认为8000debug
,是否启动调试日志输出,如果开启会降低服务性能。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时需要注意以下几点。
- WebSocket功能在使用Sanic自身启动时由
websockets
功能库来运行;但在ASGI模式下将由ASGI容器接管。 - 在ASGI模式下,Sanic的生命周期事件将被缩减为仅支持ASGI的启动和关闭事件,并受ASGI容器控制,推荐使用
after_server_start
和before_server_stop
两个事件来保证在所有环境下的兼容。 - 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()