Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add and test Gunicorn workers #116

Merged
merged 1 commit into from
Dec 22, 2024
Merged

Add and test Gunicorn workers #116

merged 1 commit into from
Dec 22, 2024

Conversation

br3ndonland
Copy link
Owner

@br3ndonland br3ndonland commented Dec 22, 2024

Description

This project supports the Gunicorn web server. Gunicorn's server design includes a primary "arbiter" process that spawns "worker" processes. Workers are child processes, each with their own running server. Workers are implemented as Python classes. Custom workers can be supplied.

This project also supports the Uvicorn web server. In the past, Uvicorn supplied workers for use with Gunicorn. The Uvicorn workers were not tested. The uvicorn.workers module was completely omitted from coverage measurement due to use of the coverage.py include setting to specify source files.

Efforts were made to test the Uvicorn workers (encode/uvicorn#1834, encode/uvicorn#1995), but the workers were arbitrarily deprecated and moved to someone's personal project (encode/uvicorn#2302), instead of an Encode-managed project as would have been expected (encode/uvicorn#517 (comment)).

Rather than introducing a production dependency on a separate Uvicorn workers package that is not managed by Encode, this PR will add the Gunicorn workers directly to this project.

Changes

Workers

This PR will add the code from uvicorn.workers to a new module inboard/gunicorn_workers.py. The code will be preserved as it was prior to deprecation, with a copy of the Uvicorn license and necessary updates for compliance with the code quality settings in this project:

  • Ruff UP008
  • Ruff UP035
  • mypy [attr-defined] - Module "uvicorn.main" does not explicitly export attribute "Server"
  • mypy [import-untyped] - gunicorn.arbiter
  • mypy [import-untyped] - gunicorn.workers.base
  • mypy [misc] - Class cannot subclass "Worker" (has type "Any")
  • mypy [type-arg] - Missing type parameters for generic type "dict" (on config_kwargs)

Tests

This PR will add tests of 100% of the Gunicorn worker code to a new module tests/test_gunicorn_workers.py.

A test fixture starts a subprocess running Gunicorn with a Uvicorn worker and an ASGI app. The subprocess includes an instance of httpx.Client for HTTP requests to the Uvicorn worker's ASGI app, and saves its output to a temporary file for assertions on stdout/stderr. Tests can send operating system signals to the process.

The coverage.py configuration will be updated for subprocess test coverage measurement. Changes to coverage measurement include:

  • Enable the required parallel mode (note that it is important to ensure the .gitignore ignores files named .coverage.* because many coverage files are generated when subprocesses are measured in parallel mode)
  • Set the required COVERAGE_PROCESS_START environment variable
  • Add the coverage_enable_subprocess package to invoke coverage.process_startup
  • Combine coverage reports before reporting coverage
  • Add instructions to contributing.md about how to omit subprocess tests

Related

Copy link

vercel bot commented Dec 22, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Updated (UTC)
inboard ✅ Ready (Inspect) Visit Preview Dec 22, 2024 1:11am

@br3ndonland br3ndonland merged commit 35d8d86 into develop Dec 22, 2024
22 checks passed
@br3ndonland br3ndonland deleted the workers branch December 22, 2024 01:19
Repository owner locked and limited conversation to collaborators Dec 22, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant