2019-09-16 18:59:16 +01:00
|
|
|
import asyncio
|
2021-08-05 20:55:42 +01:00
|
|
|
|
|
|
|
from signal import SIGINT, signal
|
|
|
|
|
2019-09-16 18:59:16 +01:00
|
|
|
import uvloop
|
|
|
|
|
2021-08-05 20:55:42 +01:00
|
|
|
from sanic import Sanic, response
|
|
|
|
from sanic.server import AsyncioServer
|
|
|
|
|
|
|
|
|
2019-09-16 18:59:16 +01:00
|
|
|
app = Sanic(__name__)
|
|
|
|
|
2021-08-05 20:55:42 +01:00
|
|
|
|
|
|
|
@app.listener("after_server_start")
|
2019-09-16 18:59:16 +01:00
|
|
|
async def after_start_test(app, loop):
|
|
|
|
print("Async Server Started!")
|
|
|
|
|
2021-08-05 20:55:42 +01:00
|
|
|
|
2019-09-16 18:59:16 +01:00
|
|
|
@app.route("/")
|
|
|
|
async def test(request):
|
|
|
|
return response.json({"answer": "42"})
|
|
|
|
|
2021-08-05 20:55:42 +01:00
|
|
|
|
2019-09-16 18:59:16 +01:00
|
|
|
asyncio.set_event_loop(uvloop.new_event_loop())
|
2021-08-05 20:55:42 +01:00
|
|
|
serv_coro = app.create_server(
|
|
|
|
host="0.0.0.0", port=8000, return_asyncio_server=True
|
|
|
|
)
|
2019-09-16 18:59:16 +01:00
|
|
|
loop = asyncio.get_event_loop()
|
|
|
|
serv_task = asyncio.ensure_future(serv_coro, loop=loop)
|
|
|
|
signal(SIGINT, lambda s, f: loop.stop())
|
2021-08-05 20:55:42 +01:00
|
|
|
server: AsyncioServer = loop.run_until_complete(serv_task) # type: ignore
|
|
|
|
server.startup()
|
|
|
|
|
|
|
|
# When using app.run(), this actually triggers before the serv_coro.
|
|
|
|
# But, in this example, we are using the convenience method, even if it is
|
|
|
|
# out of order.
|
|
|
|
server.before_start()
|
2019-09-16 18:59:16 +01:00
|
|
|
server.after_start()
|
|
|
|
try:
|
|
|
|
loop.run_forever()
|
2021-08-05 20:55:42 +01:00
|
|
|
except KeyboardInterrupt:
|
2019-09-16 18:59:16 +01:00
|
|
|
loop.stop()
|
|
|
|
finally:
|
|
|
|
server.before_stop()
|
|
|
|
|
|
|
|
# Wait for server to close
|
|
|
|
close_task = server.close()
|
|
|
|
loop.run_until_complete(close_task)
|
|
|
|
|
|
|
|
# Complete all tasks on the loop
|
|
|
|
for connection in server.connections:
|
|
|
|
connection.close_if_idle()
|
|
|
|
server.after_stop()
|