Added support for ASGI_THREADS max worker limit. (#422)

Closes #319
This commit is contained in:
Carlton Gibson 2022-07-06 12:37:26 +02:00 committed by GitHub
parent 6199d509c2
commit 71ba440761
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 1 deletions

View File

@ -20,6 +20,12 @@ Unreleased
* Added ``--log-fmt`` CLI argument. * Added ``--log-fmt`` CLI argument.
* Added support for ``ASGI_THREADS`` environment variable, setting the maximum
number of workers used by a ``SyncToAsync`` thread-pool executor.
Set e.g. ``ASGI_THREADS=4 daphne ...`` when running to limit the number of
workers.
3.0.2 (2021-04-07) 3.0.2 (2021-04-07)
------------------ ------------------

View File

@ -1,10 +1,18 @@
# This has to be done first as Twisted is import-order-sensitive with reactors # This has to be done first as Twisted is import-order-sensitive with reactors
import asyncio # isort:skip import asyncio # isort:skip
import os # isort:skip
import sys # isort:skip import sys # isort:skip
import warnings # isort:skip import warnings # isort:skip
from concurrent.futures import ThreadPoolExecutor # isort:skip
from twisted.internet import asyncioreactor # isort:skip from twisted.internet import asyncioreactor # isort:skip
twisted_loop = asyncio.new_event_loop() twisted_loop = asyncio.new_event_loop()
if "ASGI_THREADS" in os.environ:
twisted_loop.set_default_executor(
ThreadPoolExecutor(max_workers=int(os.environ["ASGI_THREADS"]))
)
current_reactor = sys.modules.get("twisted.internet.reactor", None) current_reactor = sys.modules.get("twisted.internet.reactor", None)
if current_reactor is not None: if current_reactor is not None:
if not isinstance(current_reactor, asyncioreactor.AsyncioSelectorReactor): if not isinstance(current_reactor, asyncioreactor.AsyncioSelectorReactor):

View File

@ -1,6 +1,7 @@
import logging import logging
import os
from argparse import ArgumentError from argparse import ArgumentError
from unittest import TestCase from unittest import TestCase, skipUnless
from daphne.cli import CommandLineInterface from daphne.cli import CommandLineInterface
from daphne.endpoints import build_endpoint_description_strings as build from daphne.endpoints import build_endpoint_description_strings as build
@ -255,3 +256,12 @@ class TestCLIInterface(TestCase):
Passing `--no-server-name` will set server name to '' (empty string) Passing `--no-server-name` will set server name to '' (empty string)
""" """
self.assertCLI(["--no-server-name"], {"server_name": ""}) self.assertCLI(["--no-server-name"], {"server_name": ""})
@skipUnless(os.getenv("ASGI_THREADS"), "ASGI_THREADS environment variable not set.")
class TestASGIThreads(TestCase):
def test_default_executor(self):
from daphne.server import twisted_loop
executor = twisted_loop._default_executor
self.assertEqual(executor._max_workers, int(os.getenv("ASGI_THREADS")))