mirror of
https://github.com/fastapi-practices/fastapi_best_architecture.git
synced 2026-03-13 09:31:31 +08:00
* Update the celery task result table creation logic * Disable beat_sync_every config * Update the prepared comment
66 lines
2.5 KiB
Python
66 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
import os
|
||
|
||
import celery
|
||
import celery_aio_pool
|
||
|
||
from backend.app.task.tasks.beat import LOCAL_BEAT_SCHEDULE
|
||
from backend.core.conf import settings
|
||
from backend.core.path_conf import BASE_PATH
|
||
|
||
|
||
def find_task_packages():
|
||
packages = []
|
||
task_dir = os.path.join(BASE_PATH, 'app', 'task', 'tasks')
|
||
for root, dirs, files in os.walk(task_dir):
|
||
if 'tasks.py' in files:
|
||
package = root.replace(str(BASE_PATH.parent) + os.path.sep, '').replace(os.path.sep, '.')
|
||
packages.append(package)
|
||
return packages
|
||
|
||
|
||
def init_celery() -> celery.Celery:
|
||
"""初始化 Celery 应用"""
|
||
|
||
# TODO: Update this work if celery version >= 6.0.0
|
||
# https://github.com/fastapi-practices/fastapi_best_architecture/issues/321
|
||
# https://github.com/celery/celery/issues/7874
|
||
celery.app.trace.build_tracer = celery_aio_pool.build_async_tracer
|
||
celery.app.trace.reset_worker_optimizations()
|
||
|
||
# https://docs.celeryq.dev/en/stable/userguide/configuration.html
|
||
app = celery.Celery(
|
||
'fba_celery',
|
||
broker_url=f'redis://:{settings.REDIS_PASSWORD}@{settings.REDIS_HOST}:{settings.REDIS_PORT}/{settings.CELERY_BROKER_REDIS_DATABASE}'
|
||
if settings.CELERY_BROKER == 'redis'
|
||
else f'amqp://{settings.CELERY_RABBITMQ_USERNAME}:{settings.CELERY_RABBITMQ_PASSWORD}@{settings.CELERY_RABBITMQ_HOST}:{settings.CELERY_RABBITMQ_PORT}',
|
||
broker_connection_retry_on_startup=True,
|
||
result_backend=f'db+{settings.DATABASE_TYPE}+{"pymysql" if settings.DATABASE_TYPE == "mysql" else "psycopg"}'
|
||
f'://{settings.DATABASE_USER}:{settings.DATABASE_PASSWORD}@{settings.DATABASE_HOST}:{settings.DATABASE_PORT}/{settings.DATABASE_SCHEMA}',
|
||
result_extended=True,
|
||
database_engine_options={'echo': settings.DATABASE_ECHO},
|
||
# result_expires=0,
|
||
# beat_sync_every=1,
|
||
beat_schedule=LOCAL_BEAT_SCHEDULE,
|
||
beat_scheduler='backend.app.task.utils.schedulers:DatabaseScheduler',
|
||
task_cls='backend.app.task.tasks.base:TaskBase',
|
||
task_track_started=True,
|
||
enable_utc=False,
|
||
timezone=settings.DATETIME_TIMEZONE,
|
||
)
|
||
|
||
# 在 Celery 中设置此参数无效
|
||
# 参数:https://github.com/celery/celery/issues/7270
|
||
app.loader.override_backends = {'db': 'backend.app.task.database:DatabaseBackend'}
|
||
|
||
# 自动发现任务
|
||
packages = find_task_packages()
|
||
app.autodiscover_tasks(packages)
|
||
|
||
return app
|
||
|
||
|
||
# 创建 Celery 实例
|
||
celery_app: celery.Celery = init_celery()
|