Move uvloop setup method to its own file

This commit is contained in:
prryplatypus 2021-12-07 19:55:08 +01:00
parent 877f5e6aef
commit 62b9d61fc0
No known key found for this signature in database
GPG Key ID: 6687E128FB70819B
4 changed files with 50 additions and 44 deletions

View File

@ -84,7 +84,7 @@ from sanic.response import BaseHTTPResponse, HTTPResponse
from sanic.router import Router from sanic.router import Router
from sanic.server import AsyncioServer, HttpProtocol from sanic.server import AsyncioServer, HttpProtocol
from sanic.server import Signal as ServerSignal 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.protocols.websocket_protocol import WebSocketProtocol
from sanic.server.websockets.impl import ConnectionClosed from sanic.server.websockets.impl import ConnectionClosed
from sanic.signals import Signal, SignalRouter from sanic.signals import Signal, SignalRouter
@ -1103,7 +1103,7 @@ class Sanic(BaseSanic, metaclass=TouchUpMeta):
) )
if self.config.USE_UVLOOP: if self.config.USE_UVLOOP:
use_uvloop() try_use_uvloop()
try: try:
self.is_running = True self.is_running = True

View File

@ -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.models.server_types import ConnInfo, Signal
from sanic.server.async_server import AsyncioServer 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.protocols.http_protocol import HttpProtocol
from sanic.server.runners import serve, serve_multiple, serve_single 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__ = ( __all__ = (
"AsyncioServer", "AsyncioServer",
"ConnInfo", "ConnInfo",
@ -52,4 +13,5 @@ __all__ = (
"serve", "serve",
"serve_multiple", "serve_multiple",
"serve_single", "serve_single",
"try_use_uvloop",
) )

44
sanic/server/loop.py Normal file
View File

@ -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())

View File

@ -9,7 +9,7 @@ from gunicorn.workers import base # type: ignore
from sanic.compat import UVLOOP_INSTALLED from sanic.compat import UVLOOP_INSTALLED
from sanic.log import logger 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 from sanic.server.protocols.websocket_protocol import WebSocketProtocol
@ -19,7 +19,7 @@ except ImportError:
ssl = None # type: ignore ssl = None # type: ignore
if UVLOOP_INSTALLED: if UVLOOP_INSTALLED:
use_uvloop() try_use_uvloop()
class GunicornWorker(base.Worker): class GunicornWorker(base.Worker):