Files
@ 3b1b440b5082
Branch filter:
Location: kallithea/kallithea/lib/celerypylons/__init__.py - annotation
3b1b440b5082
2.1 KiB
text/x-python
celery: use the proper configured global app for scheduling and retrieving tasks
193138922d56 broke celery, due to magic dependencies on initialization and
setting global configuration at import time.
Instead, always use the correctly configured global Celery app, both when
creating tasks and checking result status.
This has been tested to work on Python 3.6 - for example for sending mails and
forking repos.
Celery has however been found to not work on Python 3.7, due to Celery 3.x
using the new reserved keyword 'async'.
193138922d56 broke celery, due to magic dependencies on initialization and
setting global configuration at import time.
Instead, always use the correctly configured global Celery app, both when
creating tasks and checking result status.
This has been tested to work on Python 3.6 - for example for sending mails and
forking repos.
Celery has however been found to not work on Python 3.7, due to Celery 3.x
using the new reserved keyword 'async'.
d1addaf7a91e d1addaf7a91e d1addaf7a91e 7e7db11d4e4d 7e7db11d4e4d 3fb0ce6de10d 3fb0ce6de10d d1addaf7a91e 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d d1addaf7a91e 3fb0ce6de10d 3fb0ce6de10d d1addaf7a91e d1addaf7a91e 0a277465fddf 0a277465fddf 3fb0ce6de10d 0a277465fddf 0a277465fddf b9853a3cc254 3fb0ce6de10d 9d6cc55384fe 9d6cc55384fe 9d6cc55384fe 9d6cc55384fe 9d6cc55384fe 9d6cc55384fe 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 7691290837d2 7691290837d2 7691290837d2 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 970ee88be388 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d fb4b72c1c0f1 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 3fb0ce6de10d 7e7db11d4e4d 193138922d56 193138922d56 193138922d56 193138922d56 193138922d56 | # -*- coding: utf-8 -*-
"""
Kallithea wrapper of Celery
The Celery configuration is in the Kallithea ini file but must be converted to an
entirely different format before Celery can use it.
We read the configuration from tg.config at module import time. This module can
thus not be imported in global scope but must be imported on demand in function
scope after tg.config has been initialized.
To make sure that the config really has been initialized, we check one of the
mandatory settings.
"""
import celery
import celery.result as result
import tg
from celery.bin import worker
from celery.task import task
# mute pyflakes "imported but unused"
assert result
assert worker
assert task
def celery_config(config):
"""Return Celery config object populated from relevant settings in a config dict, such as tg.config"""
# Verify .ini file configuration has been loaded
assert config['celery.imports'] == 'kallithea.lib.celerylib.tasks', 'Kallithea Celery configuration has not been loaded'
class CeleryConfig(object):
pass
celery_config = CeleryConfig()
PREFIXES = """ADMINS BROKER CASSANDRA CELERYBEAT CELERYD CELERYMON CELERY EMAIL SERVER""".split()
LIST_PARAMS = """CELERY_IMPORTS ADMINS ROUTES CELERY_ACCEPT_CONTENT""".split()
for config_key, config_value in sorted(config.items()):
celery_key = config_key.replace('.', '_').upper()
if celery_key.split('_', 1)[0] not in PREFIXES:
continue
if not isinstance(config_value, str):
continue
if celery_key in LIST_PARAMS:
celery_value = config_value.split()
elif config_value.isdigit():
celery_value = int(config_value)
elif config_value.lower() in ['true', 'false']:
celery_value = config_value.lower() == 'true'
else:
celery_value = config_value
setattr(celery_config, celery_key, celery_value)
return celery_config
def make_app():
"""Create celery app from the TurboGears configuration file"""
app = celery.Celery()
app.config_from_object(celery_config(tg.config))
return app
|