|
1 | 1 | #!/usr/bin/env python3 |
2 | 2 | # -*- coding: utf-8 -*- |
| 3 | +from typing import Any |
| 4 | + |
3 | 5 | import celery |
4 | 6 | import celery_aio_pool |
5 | 7 |
|
|
9 | 11 | __all__ = ['celery_app'] |
10 | 12 |
|
11 | 13 |
|
12 | | -def init_celery() -> celery.Celery: |
13 | | - """初始化 celery 应用""" |
14 | | - |
15 | | - # TODO: Update this work if celery version >= 6.0.0 |
16 | | - # https://github.com/fastapi-practices/fastapi_best_architecture/issues/321 |
17 | | - # https://github.com/celery/celery/issues/7874 |
18 | | - celery.app.trace.build_tracer = celery_aio_pool.build_async_tracer |
19 | | - celery.app.trace.reset_worker_optimizations() |
20 | | - |
21 | | - # Celery Schedule Tasks |
22 | | - # https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html |
23 | | - beat_schedule = task_settings.CELERY_SCHEDULE |
24 | | - |
25 | | - # Celery Config |
26 | | - # https://docs.celeryq.dev/en/stable/userguide/configuration.html |
27 | | - broker_url = ( |
28 | | - ( |
| 14 | +def get_broker_url() -> str: |
| 15 | + """获取消息代理 URL""" |
| 16 | + if task_settings.CELERY_BROKER == 'redis': |
| 17 | + return ( |
29 | 18 | f'redis://:{settings.REDIS_PASSWORD}@{settings.REDIS_HOST}:' |
30 | 19 | f'{settings.REDIS_PORT}/{task_settings.CELERY_BROKER_REDIS_DATABASE}' |
31 | 20 | ) |
32 | | - if task_settings.CELERY_BROKER == 'redis' |
33 | | - else ( |
34 | | - f'amqp://{task_settings.RABBITMQ_USERNAME}:{task_settings.RABBITMQ_PASSWORD}@' |
35 | | - f'{task_settings.RABBITMQ_HOST}:{task_settings.RABBITMQ_PORT}' |
36 | | - ) |
| 21 | + return ( |
| 22 | + f'amqp://{task_settings.RABBITMQ_USERNAME}:{task_settings.RABBITMQ_PASSWORD}@' |
| 23 | + f'{task_settings.RABBITMQ_HOST}:{task_settings.RABBITMQ_PORT}' |
37 | 24 | ) |
38 | | - result_backend = ( |
| 25 | + |
| 26 | + |
| 27 | +def get_result_backend() -> str: |
| 28 | + """获取结果后端 URL""" |
| 29 | + return ( |
39 | 30 | f'redis://:{settings.REDIS_PASSWORD}@{settings.REDIS_HOST}:' |
40 | 31 | f'{settings.REDIS_PORT}/{task_settings.CELERY_BACKEND_REDIS_DATABASE}' |
41 | 32 | ) |
42 | | - result_backend_transport_options = { |
43 | | - 'global_keyprefix': f'{task_settings.CELERY_BACKEND_REDIS_PREFIX}', |
| 33 | + |
| 34 | + |
| 35 | +def get_result_backend_transport_options() -> dict[str, Any]: |
| 36 | + """获取结果后端传输选项""" |
| 37 | + return { |
| 38 | + 'global_keyprefix': task_settings.CELERY_BACKEND_REDIS_PREFIX, |
44 | 39 | 'retry_policy': { |
45 | 40 | 'timeout': task_settings.CELERY_BACKEND_REDIS_TIMEOUT, |
46 | 41 | }, |
47 | 42 | } |
48 | 43 |
|
| 44 | + |
| 45 | +def init_celery() -> celery.Celery: |
| 46 | + """初始化 Celery 应用""" |
| 47 | + |
| 48 | + # TODO: Update this work if celery version >= 6.0.0 |
| 49 | + # https://github.com/fastapi-practices/fastapi_best_architecture/issues/321 |
| 50 | + # https://github.com/celery/celery/issues/7874 |
| 51 | + celery.app.trace.build_tracer = celery_aio_pool.build_async_tracer |
| 52 | + celery.app.trace.reset_worker_optimizations() |
| 53 | + |
49 | 54 | app = celery.Celery( |
50 | 55 | 'fba_celery', |
51 | 56 | enable_utc=False, |
52 | 57 | timezone=settings.DATETIME_TIMEZONE, |
53 | | - beat_schedule=beat_schedule, |
54 | | - broker_url=broker_url, |
| 58 | + beat_schedule=task_settings.CELERY_SCHEDULE, |
| 59 | + broker_url=get_broker_url(), |
55 | 60 | broker_connection_retry_on_startup=True, |
56 | | - result_backend=result_backend, |
57 | | - result_backend_transport_options=result_backend_transport_options, |
| 61 | + result_backend=get_result_backend(), |
| 62 | + result_backend_transport_options=get_result_backend_transport_options(), |
58 | 63 | task_cls='app.task.celery_task.base:TaskBase', |
59 | 64 | task_track_started=True, |
60 | 65 | ) |
61 | 66 |
|
62 | | - # Load task modules |
| 67 | + # 自动发现任务模块 |
63 | 68 | app.autodiscover_tasks(task_settings.CELERY_TASK_PACKAGES) |
64 | 69 |
|
65 | 70 | return app |
66 | 71 |
|
67 | 72 |
|
68 | | -# 创建 celery 实例 |
| 73 | +# 创建 Celery 实例 |
69 | 74 | celery_app: celery.Celery = init_celery() |
0 commit comments