Skip to content

Worker Concurrency configuration on .ini does not work. #95

@debonzi

Description

@debonzi

Versions used:
* Python: 3.9.4
* Celery: 5.0.5
* Pyramid: 2.0
* Pyramid-Celery: 4.0.0

Before openinig this issue a digged a lot and I think I kind of understand why and how it happens but I am not sure how to fix it and even if it is possible to fix without some ajustments in the celery project itself.

I will put my findings here and hopefuly we may find a way to address it.

How to reproduce:

Files

The files can also be found here: https://github.com/debonzi/pyramid-celery-issue-sample

setup.py

from setuptools import setup, find_packages

requires = [
    "celery==5.0.5",
    "pyramid==2.0",
    "pyramid-celery==4.0.0",
]
setup(
    name="demo",
    version="0.0.1",
    install_requires=requires,
    packages=find_packages(exclude=['tests']),
    entry_points={
        "paste.app_factory": [
            "main = demo:main",
        ],
    },
)

demo.py

from pyramid.config import Configurator


def main(global_config, **settings):
    """This function returns a Pyramid WSGI application."""
    with Configurator(settings=settings) as config:
        config.include("pyramid_celery")
        config.configure_celery(global_config["__file__"])

    return config.make_wsgi_app()

conf.ini

[app:main]
use = egg:demo

[server:main]
use = egg:waitress#main
listen = localhost:6543

[celery]
broker_url = redis://localhost:6379/1
worker_concurrency = 4

Install and Run

$ pip install -e .
$ celery -A pyramid_celery.celery_app worker --ini config.ini

Output:

 -------------- celery@Doomhammer v5.0.5 (singularity)
--- ***** -----
-- ******* ---- Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-glibc2.31 2021-05-02 16:15:11
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app:         __main__:0x7f3e25b9e670
- ** ---------- .> transport:   redis://localhost:6379/1
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 8 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery

Concurrency is 8 (Number of CPU Cores on my machine) and not 4 as expected.

As fas as I could understand, celery 5 uses click and celery-pyramid uses the signal user_preload_options to configure celery using config_from_object method.

At this point it seems that celery has already loaded the click parameters into internal variables and since we didn't use --concurrency it behaves as if we have used --concurrency=0 (which will later translate to Number of CPU cores). Since command line parameters has precedency over config file parameters (config_from_object) celery will ignore the value from .ini` file and use the default value.

If you guys have a idea on how to fix (or work around it) or need any more information I might have I will be glad to provide it.

Cheers

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions