Update uvloop to 0.22.1 (#6705)

This commit is contained in:
Jakub Kuczys
2026-05-10 21:46:57 +02:00
committed by GitHub
parent 169d0eed49
commit 99babf9ad3
7 changed files with 44 additions and 28 deletions
-14
View File
@@ -289,19 +289,6 @@ class VersionInfo:
return version("Red-DiscordBot") return version("Red-DiscordBot")
def _update_event_loop_policy():
if _sys.implementation.name == "cpython":
# Let's not force this dependency, uvloop is much faster on cpython
try:
import uvloop
except ImportError:
pass
else:
import asyncio
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
def _ensure_no_colorama(): def _ensure_no_colorama():
# a hacky way to ensure that nothing initialises colorama # a hacky way to ensure that nothing initialises colorama
# if we're not running with legacy Windows command line mode # if we're not running with legacy Windows command line mode
@@ -334,7 +321,6 @@ def _early_init():
# This function replaces logger so we preferably (though not necessarily) want that to happen # This function replaces logger so we preferably (though not necessarily) want that to happen
# before importing anything that calls `logging.getLogger()`, i.e. `asyncio`. # before importing anything that calls `logging.getLogger()`, i.e. `asyncio`.
_update_logger_class() _update_logger_class()
_update_event_loop_policy()
_ensure_no_colorama() _ensure_no_colorama()
+3 -3
View File
@@ -25,7 +25,7 @@ import rich
import redbot.logging import redbot.logging
from redbot import __version__ from redbot import __version__
from redbot.core.bot import Red, ExitCodes, _NoOwnerSet from redbot.core.bot import Red, ExitCodes, _NoOwnerSet
from redbot.core._cli import interactive_config, confirm, parse_cli_flags from redbot.core._cli import interactive_config, confirm, parse_cli_flags, new_event_loop
from redbot.setup import get_data_dir, get_name, save_config from redbot.setup import get_data_dir, get_name, save_config
from redbot.core import data_manager, _drivers, _downloader from redbot.core import data_manager, _drivers, _downloader
from redbot.core._debuginfo import DebugInfo from redbot.core._debuginfo import DebugInfo
@@ -250,7 +250,7 @@ def early_exit_runner(
""" """
This one exists to not log all the things like it's a full run of the bot. This one exists to not log all the things like it's a full run of the bot.
""" """
loop = asyncio.new_event_loop() loop = new_event_loop()
asyncio.set_event_loop(loop) asyncio.set_event_loop(loop)
try: try:
if not cli_flags.instance_name: if not cli_flags.instance_name:
@@ -460,7 +460,7 @@ def main():
early_exit_runner(cli_flags, edit_instance) early_exit_runner(cli_flags, edit_instance)
return return
try: try:
loop = asyncio.new_event_loop() loop = new_event_loop()
asyncio.set_event_loop(loop) asyncio.set_event_loop(loop)
if cli_flags.no_instance: if cli_flags.no_instance:
+33 -1
View File
@@ -3,13 +3,15 @@ import asyncio
import logging import logging
import sys import sys
from enum import IntEnum from enum import IntEnum
from typing import Optional from typing import Any, Coroutine, Optional, TypeVar
import discord import discord
from discord import __version__ as discord_version from discord import __version__ as discord_version
from redbot.core.utils._internal_utils import cli_level_to_log_level from redbot.core.utils._internal_utils import cli_level_to_log_level
_T = TypeVar("_T")
# This needs to be an int enum to be used # This needs to be an int enum to be used
# with sys.exit # with sys.exit
@@ -368,3 +370,33 @@ def parse_cli_flags(args):
args.logging_level = cli_level_to_log_level(args.logging_level) args.logging_level = cli_level_to_log_level(args.logging_level)
return args return args
def asyncio_run(coro: Coroutine[Any, Any, _T]) -> _T:
if sys.version_info >= (3, 11):
with asyncio.Runner(loop_factory=new_event_loop) as runner:
return runner.run(coro)
if sys.implementation.name == "cpython":
# Let's not force this dependency, uvloop is much faster on cpython
try:
import uvloop
except ImportError:
pass
else:
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
return asyncio.run(coro)
def new_event_loop() -> asyncio.AbstractEventLoop:
if sys.implementation.name == "cpython":
# Let's not force this dependency, uvloop is much faster on cpython
try:
import uvloop
except ImportError:
pass
else:
return uvloop.new_event_loop()
return asyncio.new_event_loop()
+4 -4
View File
@@ -23,7 +23,7 @@ from redbot.core.utils._internal_utils import (
) )
from redbot.core import config, data_manager from redbot.core import config, data_manager
from redbot.core._config import migrate from redbot.core._config import migrate
from redbot.core._cli import ExitCodes from redbot.core._cli import ExitCodes, asyncio_run
from redbot.core.data_manager import appdir, config_dir, config_file from redbot.core.data_manager import appdir, config_dir, config_file
from redbot.core._drivers import ( from redbot.core._drivers import (
BackendType, BackendType,
@@ -512,7 +512,7 @@ def delete(
remove_datapath: Optional[bool], remove_datapath: Optional[bool],
) -> None: ) -> None:
"""Removes an instance.""" """Removes an instance."""
asyncio.run( asyncio_run(
remove_instance( remove_instance(
instance, interactive, delete_data, _create_backup, drop_db, remove_datapath instance, interactive, delete_data, _create_backup, drop_db, remove_datapath
) )
@@ -534,7 +534,7 @@ def convert(instance: str, backend: str) -> None:
if current_backend == BackendType.MONGOV1: if current_backend == BackendType.MONGOV1:
raise RuntimeError("Please see the 3.2 release notes for upgrading a bot using mongo.") raise RuntimeError("Please see the 3.2 release notes for upgrading a bot using mongo.")
else: else:
new_storage_details = asyncio.run(do_migration(current_backend, target)) new_storage_details = asyncio_run(do_migration(current_backend, target))
if new_storage_details is not None: if new_storage_details is not None:
default_dirs["STORAGE_TYPE"] = target.value default_dirs["STORAGE_TYPE"] = target.value
@@ -558,7 +558,7 @@ def convert(instance: str, backend: str) -> None:
) )
def backup(instance: str, destination_folder: Path) -> None: def backup(instance: str, destination_folder: Path) -> None:
"""Backup instance's data.""" """Backup instance's data."""
asyncio.run(create_backup(instance, destination_folder)) asyncio_run(create_backup(instance, destination_folder))
def run_cli(): def run_cli():
+1 -1
View File
@@ -19,7 +19,7 @@ typing_extensions
yarl yarl
distro; sys_platform == "linux" distro; sys_platform == "linux"
# https://github.com/MagicStack/uvloop/issues/702 # https://github.com/MagicStack/uvloop/issues/702
uvloop>=0.21.0,!=0.22.0,!=0.22.1; sys_platform != "win32" and platform_python_implementation == "CPython" uvloop; sys_platform != "win32" and platform_python_implementation == "CPython"
# Used by discord.py[speedup]. See Pull request #6587 for more info. # Used by discord.py[speedup]. See Pull request #6587 for more info.
Brotli Brotli
+1 -1
View File
@@ -88,7 +88,7 @@ importlib-metadata==8.5.0; python_version != "3.10" and python_version != "3.11"
# via markdown # via markdown
pytz==2026.1.post1; python_version == "3.8" pytz==2026.1.post1; python_version == "3.8"
# via babel # via babel
uvloop==0.21.0; (sys_platform != "win32" and platform_python_implementation == "CPython") and sys_platform != "win32" uvloop==0.22.1; (sys_platform != "win32" and platform_python_implementation == "CPython") and sys_platform != "win32"
# via -r base.in # via -r base.in
zipp==3.20.2; python_version != "3.10" and python_version != "3.11" zipp==3.20.2; python_version != "3.10" and python_version != "3.11"
# via importlib-metadata # via importlib-metadata
+2 -4
View File
@@ -3,16 +3,14 @@ import os
import pytest import pytest
from redbot import _update_event_loop_policy
from redbot.core import _drivers, data_manager from redbot.core import _drivers, data_manager
from redbot.core._cli import new_event_loop
_update_event_loop_policy()
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def event_loop(request): def event_loop(request):
"""Create an instance of the default event loop for entire session.""" """Create an instance of the default event loop for entire session."""
loop = asyncio.new_event_loop() loop = new_event_loop()
asyncio.set_event_loop(loop) asyncio.set_event_loop(loop)
yield loop yield loop
asyncio.set_event_loop(None) asyncio.set_event_loop(None)