From 283911d0b21a9d29514ca7ec67d6b8fe1714edeb Mon Sep 17 00:00:00 2001 From: prryplatypus <25409753+prryplatypus@users.noreply.github.com> Date: Sun, 3 Oct 2021 20:42:04 +0200 Subject: [PATCH] Make use of uvloop optional --- sanic/app.py | 5 ++++- sanic/config.py | 2 ++ sanic/server/__init__.py | 17 +++++++++++------ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/sanic/app.py b/sanic/app.py index 0686f7ed..1704aa67 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -73,7 +73,7 @@ from sanic.response import BaseHTTPResponse, HTTPResponse from sanic.router import Router from sanic.server import AsyncioServer, HttpProtocol from sanic.server import Signal as ServerSignal -from sanic.server import serve, serve_multiple, serve_single +from sanic.server import serve, serve_multiple, serve_single, use_uvloop from sanic.server.protocols.websocket_protocol import WebSocketProtocol from sanic.server.websockets.impl import ConnectionClosed from sanic.signals import Signal, SignalRouter @@ -206,6 +206,9 @@ class Sanic(BaseSanic, metaclass=TouchUpMeta): if self.config.REGISTER: self.__class__.register_app(self) + if self.config.USE_UVLOOP: + use_uvloop() + self.router.ctx.app = self self.signal_router.ctx.app = self diff --git a/sanic/config.py b/sanic/config.py index 649d9414..3a7c280a 100644 --- a/sanic/config.py +++ b/sanic/config.py @@ -36,6 +36,7 @@ DEFAULT_CONFIG = { "REQUEST_MAX_SIZE": 100000000, # 100 megabytes "REQUEST_TIMEOUT": 60, # 60 seconds "RESPONSE_TIMEOUT": 60, # 60 seconds + "USE_UVLOOP": True, "WEBSOCKET_MAX_SIZE": 2 ** 20, # 1 megabyte "WEBSOCKET_PING_INTERVAL": 20, "WEBSOCKET_PING_TIMEOUT": 20, @@ -61,6 +62,7 @@ class Config(dict): REQUEST_TIMEOUT: int RESPONSE_TIMEOUT: int SERVER_NAME: str + USE_UVLOOP: bool WEBSOCKET_MAX_SIZE: int WEBSOCKET_PING_INTERVAL: int WEBSOCKET_PING_TIMEOUT: int diff --git a/sanic/server/__init__.py b/sanic/server/__init__.py index 8e26dcd0..4c63d17e 100644 --- a/sanic/server/__init__.py +++ b/sanic/server/__init__.py @@ -6,13 +6,18 @@ from sanic.server.protocols.http_protocol import HttpProtocol from sanic.server.runners import serve, serve_multiple, serve_single -try: - import uvloop # type: ignore +def use_uvloop(): + """ + Use uvloop (if available) instead of the default + asyncio loop. + """ + try: + import uvloop # type: ignore - if not isinstance(asyncio.get_event_loop_policy(), uvloop.EventLoopPolicy): - asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) -except ImportError: - pass + if not isinstance(asyncio.get_event_loop_policy(), uvloop.EventLoopPolicy): + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + except ImportError: + pass __all__ = (