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

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

Open
debonzi opened this issue May 2, 2021 · 0 comments
Open

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

debonzi opened this issue May 2, 2021 · 0 comments

Comments

@debonzi
Copy link

debonzi commented May 2, 2021

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant