From c0b662cbd7551eeef31300f4575ac15e8b8e9528 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 7 Sep 2021 16:06:54 -0700 Subject: [PATCH 1/6] Adds priority queues to celery --- celerywyrm/celery.py | 2 +- celerywyrm/settings.py | 16 ++++++++++++++++ docker-compose.yml | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/celerywyrm/celery.py b/celerywyrm/celery.py index de5e5630..0b4ff7bd 100644 --- a/celerywyrm/celery.py +++ b/celerywyrm/celery.py @@ -3,7 +3,7 @@ from __future__ import absolute_import, unicode_literals import os from celery import Celery -from . import settings +from . import settings # pylint: disable=unused-import # set the default Django settings module for the 'celery' program. diff --git a/celerywyrm/settings.py b/celerywyrm/settings.py index a67ab411..48d13446 100644 --- a/celerywyrm/settings.py +++ b/celerywyrm/settings.py @@ -10,6 +10,22 @@ CELERY_RESULT_BACKEND = "redis://:{}@redis_broker:{}/0".format( requests.utils.quote(env("REDIS_BROKER_PASSWORD", "")), env("REDIS_BROKER_PORT") ) +CELERY_TASK_ROUTES = ([ + # high - should really happen ASAP + ("bookwyrm.emailing.*", {"queue": "high_priority"}), + # medium - should really happen + ("bookwyrm.activitypub.base_activity.*", {"queue": "medium_priority"}), + ("bookwyrm.views.inbox.*", {"queue": "medium_priority"}), + ("bookwyrm.broadcast.*", {"queue": "medium_priority"}), + ("bookwyrm.activitystreams.*", {"queue": "medium_priority"}), + # low - no rush + ("bookwyrm.connectors.abstract_connector.*", {"queue": "low_priority"}), + ("bookwyrm.goodreads_import.*", {"queue": "low_priority"}), + ("bookwyrm.models.user.*", {"queue": "low_priority"}), + ("bookwyrm.suggested_users.*", {"queue": "low_priority"}), + ("bookwyrm.preview_images.*", {"queue": "low_priority"}), +]) + CELERY_ACCEPT_CONTENT = ["json"] CELERY_TASK_SERIALIZER = "json" CELERY_RESULT_SERIALIZER = "json" diff --git a/docker-compose.yml b/docker-compose.yml index 49d02e70..5d24a4b7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -63,7 +63,7 @@ services: build: . networks: - main - command: celery -A celerywyrm worker -l info + command: celery -A celerywyrm worker -l info -Q high_priority,medium_priority,low_priority volumes: - .:/app - static_volume:/app/static From 7b2e4eebd2b4dabb8c079583f2d2d26002ac9492 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 7 Sep 2021 16:33:18 -0700 Subject: [PATCH 2/6] Remove unused code from celery --- celerywyrm/celery.py | 10 ---------- celerywyrm/settings.py | 16 +--------------- 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/celerywyrm/celery.py b/celerywyrm/celery.py index 0b4ff7bd..3a0969e5 100644 --- a/celerywyrm/celery.py +++ b/celerywyrm/celery.py @@ -19,13 +19,3 @@ app.config_from_object("django.conf:settings", namespace="CELERY") # Load task modules from all registered Django app configs. app.autodiscover_tasks() -app.autodiscover_tasks(["bookwyrm"], related_name="activitypub.base_activity") -app.autodiscover_tasks(["bookwyrm"], related_name="activitystreams") -app.autodiscover_tasks(["bookwyrm"], related_name="broadcast") -app.autodiscover_tasks(["bookwyrm"], related_name="connectors.abstract_connector") -app.autodiscover_tasks(["bookwyrm"], related_name="emailing") -app.autodiscover_tasks(["bookwyrm"], related_name="goodreads_import") -app.autodiscover_tasks(["bookwyrm"], related_name="preview_images") -app.autodiscover_tasks(["bookwyrm"], related_name="models.user") -app.autodiscover_tasks(["bookwyrm"], related_name="suggested_users") -app.autodiscover_tasks(["bookwyrm"], related_name="views.inbox") diff --git a/celerywyrm/settings.py b/celerywyrm/settings.py index 48d13446..55af4ce4 100644 --- a/celerywyrm/settings.py +++ b/celerywyrm/settings.py @@ -10,21 +10,7 @@ CELERY_RESULT_BACKEND = "redis://:{}@redis_broker:{}/0".format( requests.utils.quote(env("REDIS_BROKER_PASSWORD", "")), env("REDIS_BROKER_PORT") ) -CELERY_TASK_ROUTES = ([ - # high - should really happen ASAP - ("bookwyrm.emailing.*", {"queue": "high_priority"}), - # medium - should really happen - ("bookwyrm.activitypub.base_activity.*", {"queue": "medium_priority"}), - ("bookwyrm.views.inbox.*", {"queue": "medium_priority"}), - ("bookwyrm.broadcast.*", {"queue": "medium_priority"}), - ("bookwyrm.activitystreams.*", {"queue": "medium_priority"}), - # low - no rush - ("bookwyrm.connectors.abstract_connector.*", {"queue": "low_priority"}), - ("bookwyrm.goodreads_import.*", {"queue": "low_priority"}), - ("bookwyrm.models.user.*", {"queue": "low_priority"}), - ("bookwyrm.suggested_users.*", {"queue": "low_priority"}), - ("bookwyrm.preview_images.*", {"queue": "low_priority"}), -]) +CELERY_DEFAULT_QUEUE="low_priority" CELERY_ACCEPT_CONTENT = ["json"] CELERY_TASK_SERIALIZER = "json" From de3f18655cb1b793013847f33f7dbdf09bb4ab8d Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 7 Sep 2021 16:33:43 -0700 Subject: [PATCH 3/6] Set priorities on tasks --- bookwyrm/activitypub/base_activity.py | 2 +- bookwyrm/activitystreams.py | 18 +++++++++--------- bookwyrm/connectors/connector_manager.py | 2 +- bookwyrm/emailing.py | 2 +- bookwyrm/importers/importer.py | 2 +- bookwyrm/models/activitypub_mixin.py | 2 +- bookwyrm/models/user.py | 4 ++-- bookwyrm/preview_images.py | 6 +++--- bookwyrm/suggested_users.py | 8 ++++---- bookwyrm/views/inbox.py | 2 +- 10 files changed, 24 insertions(+), 24 deletions(-) diff --git a/bookwyrm/activitypub/base_activity.py b/bookwyrm/activitypub/base_activity.py index 52b1b1f2..4f7b55d5 100644 --- a/bookwyrm/activitypub/base_activity.py +++ b/bookwyrm/activitypub/base_activity.py @@ -213,7 +213,7 @@ class ActivityObject: return data -@app.task +@app.task(queue="medium_priority") @transaction.atomic def set_related_field( model_name, origin_model_name, related_field_name, related_remote_id, data diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index f59eaf2e..00ee5c77 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -395,7 +395,7 @@ def remove_statuses_on_unshelve(sender, instance, *args, **kwargs): # ---- TASKS -@app.task +@app.task(priority="low_priority") def add_book_statuses_task(user_id, book_id): """add statuses related to a book on shelve""" user = models.User.objects.get(id=user_id) @@ -403,7 +403,7 @@ def add_book_statuses_task(user_id, book_id): BooksStream().add_book_statuses(user, book) -@app.task +@app.task(priority="low_priority") def remove_book_statuses_task(user_id, book_id): """remove statuses about a book from a user's books feed""" user = models.User.objects.get(id=user_id) @@ -411,7 +411,7 @@ def remove_book_statuses_task(user_id, book_id): BooksStream().remove_book_statuses(user, book) -@app.task +@app.task(priority="medium_priority") def populate_stream_task(stream, user_id): """background task for populating an empty activitystream""" user = models.User.objects.get(id=user_id) @@ -419,7 +419,7 @@ def populate_stream_task(stream, user_id): stream.populate_streams(user) -@app.task +@app.task(priority="medium_priority") def remove_status_task(status_ids): """remove a status from any stream it might be in""" # this can take an id or a list of ids @@ -432,7 +432,7 @@ def remove_status_task(status_ids): stream.remove_object_from_related_stores(status) -@app.task +@app.task(priority="medium_priority") def add_status_task(status_id, increment_unread=False): """remove a status from any stream it might be in""" status = models.Status.objects.get(id=status_id) @@ -440,7 +440,7 @@ def add_status_task(status_id, increment_unread=False): stream.add_status(status, increment_unread=increment_unread) -@app.task +@app.task(priority="medium_priority") def remove_user_statuses_task(viewer_id, user_id, stream_list=None): """remove all statuses by a user from a viewer's stream""" stream_list = [streams[s] for s in stream_list] if stream_list else streams.values() @@ -450,9 +450,9 @@ def remove_user_statuses_task(viewer_id, user_id, stream_list=None): stream.remove_user_statuses(viewer, user) -@app.task +@app.task(priority="medium_priority") def add_user_statuses_task(viewer_id, user_id, stream_list=None): - """remove all statuses by a user from a viewer's stream""" + """add all statuses by a user to a viewer's stream""" stream_list = [streams[s] for s in stream_list] if stream_list else streams.values() viewer = models.User.objects.get(id=viewer_id) user = models.User.objects.get(id=user_id) @@ -460,7 +460,7 @@ def add_user_statuses_task(viewer_id, user_id, stream_list=None): stream.add_user_statuses(viewer, user) -@app.task +@app.task(priority="medium_priority") def handle_boost_task(boost_id): """remove the original post and other, earlier boosts""" instance = models.Status.objects.get(id=boost_id) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 1a615c9b..798e90aa 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -119,7 +119,7 @@ def get_or_create_connector(remote_id): return load_connector(connector_info) -@app.task +@app.task(priority="low_priority") def load_more_data(connector_id, book_id): """background the work of getting all 10,000 editions of LoTR""" connector_info = models.Connector.objects.get(id=connector_id) diff --git a/bookwyrm/emailing.py b/bookwyrm/emailing.py index fff3985e..4f43c69e 100644 --- a/bookwyrm/emailing.py +++ b/bookwyrm/emailing.py @@ -64,7 +64,7 @@ def format_email(email_name, data): return (subject, html_content, text_content) -@app.task +@app.task(queue="high_priority") def send_email(recipient, subject, html_content, text_content): """use a task to send the email""" email = EmailMultiAlternatives( diff --git a/bookwyrm/importers/importer.py b/bookwyrm/importers/importer.py index d5f1449c..97614171 100644 --- a/bookwyrm/importers/importer.py +++ b/bookwyrm/importers/importer.py @@ -61,7 +61,7 @@ class Importer: job.save() -@app.task +@app.task(priority="low_priority") def import_data(source, job_id): """does the actual lookup work in a celery task""" job = ImportJob.objects.get(id=job_id) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index f287b752..ed51158b 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -502,7 +502,7 @@ def unfurl_related_field(related_field, sort_field=None): return related_field.remote_id -@app.task +@app.task(queue="medium_priority") def broadcast_task(sender_id, activity, recipients): """the celery task for broadcast""" user_model = apps.get_model("bookwyrm.User", require_ready=True) diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index 7756846f..d2a2c276 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -425,7 +425,7 @@ class AnnualGoal(BookWyrmModel): } -@app.task +@app.task(priority="low_priority") def set_remote_server(user_id): """figure out the user's remote server in the background""" user = User.objects.get(id=user_id) @@ -464,7 +464,7 @@ def get_or_create_remote_server(domain): return server -@app.task +@app.task(priority="low_priority") def get_remote_reviews(outbox): """ingest reviews by a new remote bookwyrm user""" outbox_page = outbox + "?page=true&type=Review" diff --git a/bookwyrm/preview_images.py b/bookwyrm/preview_images.py index 4f85bb56..5e9ad2f2 100644 --- a/bookwyrm/preview_images.py +++ b/bookwyrm/preview_images.py @@ -352,7 +352,7 @@ def save_and_cleanup(image, instance=None): # pylint: disable=invalid-name -@app.task +@app.task(priority="low_priority") def generate_site_preview_image_task(): """generate preview_image for the website""" if not settings.ENABLE_PREVIEW_IMAGES: @@ -377,7 +377,7 @@ def generate_site_preview_image_task(): # pylint: disable=invalid-name -@app.task +@app.task(priority="low_priority") def generate_edition_preview_image_task(book_id): """generate preview_image for a book""" if not settings.ENABLE_PREVIEW_IMAGES: @@ -402,7 +402,7 @@ def generate_edition_preview_image_task(book_id): save_and_cleanup(image, instance=book) -@app.task +@app.task(priority="low_priority") def generate_user_preview_image_task(user_id): """generate preview_image for a book""" if not settings.ENABLE_PREVIEW_IMAGES: diff --git a/bookwyrm/suggested_users.py b/bookwyrm/suggested_users.py index 9c42d79d..808fc021 100644 --- a/bookwyrm/suggested_users.py +++ b/bookwyrm/suggested_users.py @@ -194,27 +194,27 @@ def add_new_user(sender, instance, created, update_fields=None, **kwargs): remove_user_task.delay(instance.id) -@app.task +@app.task(priority="low_priority") def rerank_suggestions_task(user_id): """do the hard work in celery""" suggested_users.rerank_user_suggestions(user_id) -@app.task +@app.task(priority="low_priority") def rerank_user_task(user_id, update_only=False): """do the hard work in celery""" user = models.User.objects.get(id=user_id) suggested_users.rerank_obj(user, update_only=update_only) -@app.task +@app.task(priority="low_priority") def remove_user_task(user_id): """do the hard work in celery""" user = models.User.objects.get(id=user_id) suggested_users.remove_object_from_related_stores(user) -@app.task +@app.task(priority="medium_priority") def remove_suggestion_task(user_id, suggested_user_id): """remove a specific user from a specific user's suggestions""" suggested_user = models.User.objects.get(id=suggested_user_id) diff --git a/bookwyrm/views/inbox.py b/bookwyrm/views/inbox.py index ff5fa46d..e255b4fa 100644 --- a/bookwyrm/views/inbox.py +++ b/bookwyrm/views/inbox.py @@ -93,7 +93,7 @@ def is_blocked_activity(activity_json): return models.FederatedServer.is_blocked(actor) -@app.task +@app.task(queue="medium_priority") def activity_task(activity_json): """do something with this json we think is legit""" # lets see if the activitypub module can make sense of this json From 26adf2d974940cebae61451b3d9dc4e22c903488 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 7 Sep 2021 17:04:10 -0700 Subject: [PATCH 4/6] Fixes queue for import task --- bookwyrm/importers/importer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/importers/importer.py b/bookwyrm/importers/importer.py index 97614171..0968cdd7 100644 --- a/bookwyrm/importers/importer.py +++ b/bookwyrm/importers/importer.py @@ -61,7 +61,7 @@ class Importer: job.save() -@app.task(priority="low_priority") +@app.task(queue="low_priority") def import_data(source, job_id): """does the actual lookup work in a celery task""" job = ImportJob.objects.get(id=job_id) From aa91361fe4a42286ea4add274c831525967a373e Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 7 Sep 2021 17:09:44 -0700 Subject: [PATCH 5/6] Fixes celery kwarg for queue --- bookwyrm/activitystreams.py | 16 ++++++++-------- bookwyrm/connectors/connector_manager.py | 2 +- bookwyrm/models/user.py | 4 ++-- bookwyrm/preview_images.py | 6 +++--- bookwyrm/suggested_users.py | 8 ++++---- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 00ee5c77..c32dfa35 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -395,7 +395,7 @@ def remove_statuses_on_unshelve(sender, instance, *args, **kwargs): # ---- TASKS -@app.task(priority="low_priority") +@app.task(queue="low_priority") def add_book_statuses_task(user_id, book_id): """add statuses related to a book on shelve""" user = models.User.objects.get(id=user_id) @@ -403,7 +403,7 @@ def add_book_statuses_task(user_id, book_id): BooksStream().add_book_statuses(user, book) -@app.task(priority="low_priority") +@app.task(queue="low_priority") def remove_book_statuses_task(user_id, book_id): """remove statuses about a book from a user's books feed""" user = models.User.objects.get(id=user_id) @@ -411,7 +411,7 @@ def remove_book_statuses_task(user_id, book_id): BooksStream().remove_book_statuses(user, book) -@app.task(priority="medium_priority") +@app.task(queue="medium_priority") def populate_stream_task(stream, user_id): """background task for populating an empty activitystream""" user = models.User.objects.get(id=user_id) @@ -419,7 +419,7 @@ def populate_stream_task(stream, user_id): stream.populate_streams(user) -@app.task(priority="medium_priority") +@app.task(queue="medium_priority") def remove_status_task(status_ids): """remove a status from any stream it might be in""" # this can take an id or a list of ids @@ -432,7 +432,7 @@ def remove_status_task(status_ids): stream.remove_object_from_related_stores(status) -@app.task(priority="medium_priority") +@app.task(queue="medium_priority") def add_status_task(status_id, increment_unread=False): """remove a status from any stream it might be in""" status = models.Status.objects.get(id=status_id) @@ -440,7 +440,7 @@ def add_status_task(status_id, increment_unread=False): stream.add_status(status, increment_unread=increment_unread) -@app.task(priority="medium_priority") +@app.task(queue="medium_priority") def remove_user_statuses_task(viewer_id, user_id, stream_list=None): """remove all statuses by a user from a viewer's stream""" stream_list = [streams[s] for s in stream_list] if stream_list else streams.values() @@ -450,7 +450,7 @@ def remove_user_statuses_task(viewer_id, user_id, stream_list=None): stream.remove_user_statuses(viewer, user) -@app.task(priority="medium_priority") +@app.task(queue="medium_priority") def add_user_statuses_task(viewer_id, user_id, stream_list=None): """add all statuses by a user to a viewer's stream""" stream_list = [streams[s] for s in stream_list] if stream_list else streams.values() @@ -460,7 +460,7 @@ def add_user_statuses_task(viewer_id, user_id, stream_list=None): stream.add_user_statuses(viewer, user) -@app.task(priority="medium_priority") +@app.task(queue="medium_priority") def handle_boost_task(boost_id): """remove the original post and other, earlier boosts""" instance = models.Status.objects.get(id=boost_id) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 798e90aa..1d9588d6 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -119,7 +119,7 @@ def get_or_create_connector(remote_id): return load_connector(connector_info) -@app.task(priority="low_priority") +@app.task(queue="low_priority") def load_more_data(connector_id, book_id): """background the work of getting all 10,000 editions of LoTR""" connector_info = models.Connector.objects.get(id=connector_id) diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index d2a2c276..4b03f665 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -425,7 +425,7 @@ class AnnualGoal(BookWyrmModel): } -@app.task(priority="low_priority") +@app.task(queue="low_priority") def set_remote_server(user_id): """figure out the user's remote server in the background""" user = User.objects.get(id=user_id) @@ -464,7 +464,7 @@ def get_or_create_remote_server(domain): return server -@app.task(priority="low_priority") +@app.task(queue="low_priority") def get_remote_reviews(outbox): """ingest reviews by a new remote bookwyrm user""" outbox_page = outbox + "?page=true&type=Review" diff --git a/bookwyrm/preview_images.py b/bookwyrm/preview_images.py index 5e9ad2f2..900a3e12 100644 --- a/bookwyrm/preview_images.py +++ b/bookwyrm/preview_images.py @@ -352,7 +352,7 @@ def save_and_cleanup(image, instance=None): # pylint: disable=invalid-name -@app.task(priority="low_priority") +@app.task(queue="low_priority") def generate_site_preview_image_task(): """generate preview_image for the website""" if not settings.ENABLE_PREVIEW_IMAGES: @@ -377,7 +377,7 @@ def generate_site_preview_image_task(): # pylint: disable=invalid-name -@app.task(priority="low_priority") +@app.task(queue="low_priority") def generate_edition_preview_image_task(book_id): """generate preview_image for a book""" if not settings.ENABLE_PREVIEW_IMAGES: @@ -402,7 +402,7 @@ def generate_edition_preview_image_task(book_id): save_and_cleanup(image, instance=book) -@app.task(priority="low_priority") +@app.task(queue="low_priority") def generate_user_preview_image_task(user_id): """generate preview_image for a book""" if not settings.ENABLE_PREVIEW_IMAGES: diff --git a/bookwyrm/suggested_users.py b/bookwyrm/suggested_users.py index 808fc021..92902938 100644 --- a/bookwyrm/suggested_users.py +++ b/bookwyrm/suggested_users.py @@ -194,27 +194,27 @@ def add_new_user(sender, instance, created, update_fields=None, **kwargs): remove_user_task.delay(instance.id) -@app.task(priority="low_priority") +@app.task(queue="low_priority") def rerank_suggestions_task(user_id): """do the hard work in celery""" suggested_users.rerank_user_suggestions(user_id) -@app.task(priority="low_priority") +@app.task(queue="low_priority") def rerank_user_task(user_id, update_only=False): """do the hard work in celery""" user = models.User.objects.get(id=user_id) suggested_users.rerank_obj(user, update_only=update_only) -@app.task(priority="low_priority") +@app.task(queue="low_priority") def remove_user_task(user_id): """do the hard work in celery""" user = models.User.objects.get(id=user_id) suggested_users.remove_object_from_related_stores(user) -@app.task(priority="medium_priority") +@app.task(queue="medium_priority") def remove_suggestion_task(user_id, suggested_user_id): """remove a specific user from a specific user's suggestions""" suggested_user = models.User.objects.get(id=suggested_user_id) From e608d8b8ade727975629de38c63be0598426de5f Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 7 Sep 2021 17:11:32 -0700 Subject: [PATCH 6/6] python formatting --- celerywyrm/celery.py | 2 +- celerywyrm/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/celerywyrm/celery.py b/celerywyrm/celery.py index 3a0969e5..8e45db90 100644 --- a/celerywyrm/celery.py +++ b/celerywyrm/celery.py @@ -3,7 +3,7 @@ from __future__ import absolute_import, unicode_literals import os from celery import Celery -from . import settings # pylint: disable=unused-import +from . import settings # pylint: disable=unused-import # set the default Django settings module for the 'celery' program. diff --git a/celerywyrm/settings.py b/celerywyrm/settings.py index 55af4ce4..05ffdcab 100644 --- a/celerywyrm/settings.py +++ b/celerywyrm/settings.py @@ -10,7 +10,7 @@ CELERY_RESULT_BACKEND = "redis://:{}@redis_broker:{}/0".format( requests.utils.quote(env("REDIS_BROKER_PASSWORD", "")), env("REDIS_BROKER_PORT") ) -CELERY_DEFAULT_QUEUE="low_priority" +CELERY_DEFAULT_QUEUE = "low_priority" CELERY_ACCEPT_CONTENT = ["json"] CELERY_TASK_SERIALIZER = "json"