From 62b9d61fc0ea597e838b040064c07a2b5581fe33 Mon Sep 17 00:00:00 2001 From: prryplatypus <25409753+prryplatypus@users.noreply.github.com> Date: Tue, 7 Dec 2021 19:55:08 +0100 Subject: [PATCH] Move uvloop setup method to its own file --- sanic/app.py | 4 ++-- sanic/server/__init__.py | 42 ++------------------------------------ sanic/server/loop.py | 44 ++++++++++++++++++++++++++++++++++++++++ sanic/worker.py | 4 ++-- 4 files changed, 50 insertions(+), 44 deletions(-) create mode 100644 sanic/server/loop.py diff --git a/sanic/app.py b/sanic/app.py index bb27d47a..cbd3ed2f 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -84,7 +84,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, use_uvloop +from sanic.server import serve, serve_multiple, serve_single, try_use_uvloop from sanic.server.protocols.websocket_protocol import WebSocketProtocol from sanic.server.websockets.impl import ConnectionClosed from sanic.signals import Signal, SignalRouter @@ -1103,7 +1103,7 @@ class Sanic(BaseSanic, metaclass=TouchUpMeta): ) if self.config.USE_UVLOOP: - use_uvloop() + try_use_uvloop() try: self.is_running = True diff --git a/sanic/server/__init__.py b/sanic/server/__init__.py index f5e898e1..116bd05c 100644 --- a/sanic/server/__init__.py +++ b/sanic/server/__init__.py @@ -1,49 +1,10 @@ -import asyncio -import os - -from distutils.util import strtobool - -from sanic.compat import OS_IS_WINDOWS -from sanic.log import error_logger from sanic.models.server_types import ConnInfo, Signal from sanic.server.async_server import AsyncioServer +from sanic.server.loop import try_use_uvloop from sanic.server.protocols.http_protocol import HttpProtocol from sanic.server.runners import serve, serve_multiple, serve_single -def use_uvloop() -> None: - """ - Use uvloop instead of the default asyncio loop. - """ - try: - import uvloop # type: ignore - - if strtobool(os.environ.get("SANIC_NO_UVLOOP", "no")): - error_logger.warning( - "You are running Sanic using uvloop, but the " - "'SANIC_NO_UVLOOP' environment variable (used to opt-out " - "of installing uvloop with Sanic) is set to true. If you " - "want to disable uvloop with Sanic, set the 'USE_UVLOOP' " - "configuration value to false." - ) - - if not isinstance( - asyncio.get_event_loop_policy(), uvloop.EventLoopPolicy - ): - asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) - - except ImportError: - if not OS_IS_WINDOWS: - error_logger.warning( - "You are trying to use uvloop, but uvloop is not " - "installed in your system. In order to use uvloop " - "you must first install it. Otherwise, you can disable " - "uvloop completely by setting the 'USE_UVLOOP' " - "configuration value to false. Sanic will now continue " - "to run without using uvloop." - ) - - __all__ = ( "AsyncioServer", "ConnInfo", @@ -52,4 +13,5 @@ __all__ = ( "serve", "serve_multiple", "serve_single", + "try_use_uvloop", ) diff --git a/sanic/server/loop.py b/sanic/server/loop.py new file mode 100644 index 00000000..b6283727 --- /dev/null +++ b/sanic/server/loop.py @@ -0,0 +1,44 @@ +import asyncio +import os + +from distutils.util import strtobool + +from sanic.compat import OS_IS_WINDOWS +from sanic.log import error_logger + + +def try_use_uvloop() -> None: + """ + Use uvloop instead of the default asyncio loop. + """ + if OS_IS_WINDOWS: # uvloop is not compatible + return + + try: + import uvloop # type: ignore + except ImportError: + error_logger.warning( + "You are trying to use uvloop, but uvloop is not " + "installed in your system. In order to use uvloop " + "you must first install it. Otherwise, you can disable " + "uvloop completely by setting the 'USE_UVLOOP' " + "configuration value to false. Sanic will now continue " + "to run with the default event loop." + ) + return + + uvloop_install_removed = strtobool(os.environ.get("SANIC_NO_UVLOOP", "no")) + if uvloop_install_removed: + error_logger.info( + "You are requesting to run Sanic using uvloop, but the " + "install-time 'SANIC_NO_UVLOOP' environment variable (used to " + "opt-out of installing uvloop with Sanic) is set to true. If " + "you want to prevent Sanic from overriding the event loop policy " + "during runtime, set the 'USE_UVLOOP' configuration value to " + "false." + ) + + if not isinstance( + asyncio.get_event_loop_policy(), uvloop.EventLoopPolicy + ): + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) diff --git a/sanic/worker.py b/sanic/worker.py index 91c0f590..cdc238e2 100644 --- a/sanic/worker.py +++ b/sanic/worker.py @@ -9,7 +9,7 @@ from gunicorn.workers import base # type: ignore from sanic.compat import UVLOOP_INSTALLED from sanic.log import logger -from sanic.server import HttpProtocol, Signal, serve, use_uvloop +from sanic.server import HttpProtocol, Signal, serve, try_use_uvloop from sanic.server.protocols.websocket_protocol import WebSocketProtocol @@ -19,7 +19,7 @@ except ImportError: ssl = None # type: ignore if UVLOOP_INSTALLED: - use_uvloop() + try_use_uvloop() class GunicornWorker(base.Worker):