Skip to content

Commit e45d2d6

Browse files
authored
Add CLI support for startup celery services (#724)
* Add CLI support for startup celery services * update the cli file
1 parent 4ddf84f commit e45d2d6

File tree

3 files changed

+83
-11
lines changed

3 files changed

+83
-11
lines changed

backend/app/task/celery.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def find_task_packages():
1515
packages = []
1616
for root, dirs, files in os.walk(os.path.join(BASE_PATH, 'app', 'task', 'tasks')):
1717
if 'tasks.py' in files:
18-
package = root.replace(str(BASE_PATH) + os.path.sep, '').replace(os.path.sep, '.')
18+
package = root.replace(str(BASE_PATH.parent) + os.path.sep, '').replace(os.path.sep, '.')
1919
packages.append(package)
2020
return packages
2121

@@ -45,8 +45,8 @@ def init_celery() -> celery.Celery:
4545
result_extended=True,
4646
# result_expires=0, # 任务结果自动清理,0 或 None 表示不清理
4747
beat_schedule=LOCAL_BEAT_SCHEDULE,
48-
beat_scheduler='app.task.utils.schedulers:DatabaseScheduler',
49-
task_cls='app.task.tasks.base:TaskBase',
48+
beat_scheduler='backend.app.task.utils.schedulers:DatabaseScheduler',
49+
task_cls='backend.app.task.tasks.base:TaskBase',
5050
task_track_started=True,
5151
enable_utc=False,
5252
timezone=settings.DATETIME_TIMEZONE,

backend/celery-start.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#!/usr/bin/env bash
22

33
# work && beat
4-
celery -A app.task.celery worker -l info -P gevent -c 100 &
4+
celery -A backend.app.task.celery worker -l info -P gevent -c 100 &
55

66
# beat
7-
celery -A app.task.celery beat -l info &
7+
celery -A backend.app.task.celery beat -l info &
88

99
# flower
10-
celery -A app.task.celery flower --port=8555 --basic-auth=admin:123456
10+
celery -A backend.app.task.celery flower --port=8555 --basic-auth=admin:123456

backend/cli.py

Lines changed: 77 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#!/usr/bin/env python3
22
# -*- coding: utf-8 -*-
33
import asyncio
4+
import subprocess
45

56
from dataclasses import dataclass
6-
from typing import Annotated
7+
from typing import Annotated, Literal
78

89
import cappa
910
import granian
@@ -49,6 +50,34 @@ def run(host: str, port: int, reload: bool, workers: int | None) -> None:
4950
).serve()
5051

5152

53+
def run_celery_worker(log_level: Literal['info', 'debug']) -> None:
54+
try:
55+
subprocess.run(['celery', '-A', 'backend.app.task.celery', 'worker', '-l', f'{log_level}', '-P', 'gevent'])
56+
except KeyboardInterrupt:
57+
pass
58+
59+
60+
def run_celery_beat(log_level: Literal['info', 'debug']) -> None:
61+
try:
62+
subprocess.run(['celery', '-A', 'backend.app.task.celery', 'beat', '-l', f'{log_level}'])
63+
except KeyboardInterrupt:
64+
pass
65+
66+
67+
def run_celery_flower(port: int, basic_auth: str) -> None:
68+
try:
69+
subprocess.run([
70+
'celery',
71+
'-A',
72+
'backend.app.task.celery',
73+
'flower',
74+
f'--port={port}',
75+
f'--basic-auth={basic_auth}',
76+
])
77+
except KeyboardInterrupt:
78+
pass
79+
80+
5281
async def install_plugin(
5382
path: str, repo_url: str, no_sql: bool, db_type: DataBaseType, pk_type: PrimaryKeyType
5483
) -> None:
@@ -89,7 +118,7 @@ async def execute_sql_scripts(sql_scripts: str) -> None:
89118
console.print(Text('SQL 脚本已执行完成', style='bold green'))
90119

91120

92-
@cappa.command(help='运行服务')
121+
@cappa.command(help='运行 API 服务')
93122
@dataclass
94123
class Run:
95124
host: Annotated[
@@ -118,6 +147,49 @@ def __call__(self):
118147
run(host=self.host, port=self.port, reload=self.no_reload, workers=self.workers)
119148

120149

150+
@cappa.command(help='从当前主机启动 Celery worker 服务')
151+
@dataclass
152+
class Worker:
153+
log_level: Annotated[
154+
Literal['info', 'debug'],
155+
cappa.Arg(long=True, short='-l', default='info', help='日志输出级别'),
156+
]
157+
158+
def __call__(self):
159+
run_celery_worker(log_level=self.log_level)
160+
161+
162+
@cappa.command(help='从当前主机启动 Celery beat 服务')
163+
@dataclass
164+
class Beat:
165+
log_level: Annotated[
166+
Literal['info', 'debug'],
167+
cappa.Arg(long=True, short='-l', default='info', help='日志输出级别'),
168+
]
169+
170+
def __call__(self):
171+
run_celery_beat(log_level=self.log_level)
172+
173+
174+
@cappa.command(help='从当前主机启动 Celery flower 服务')
175+
@dataclass
176+
class Flower:
177+
port: Annotated[int, cappa.Arg(long=True, default=8555, help='提供服务的主机端口号')]
178+
basic_auth: Annotated[str, cappa.Arg(long=True, default='admin:123456', help='页面登录的用户名和密码')]
179+
180+
def __call__(self):
181+
run_celery_flower(port=self.port, basic_auth=self.basic_auth)
182+
183+
184+
@cappa.command(help='运行 Celery 服务')
185+
@dataclass
186+
class Celery:
187+
subcmd: cappa.Subcommands[Worker | Beat | Flower | None] = None
188+
189+
def __call__(self):
190+
console.print('\n更多信息,尝试 "[cyan]--help[/]"')
191+
192+
121193
@cappa.command(help='新增插件')
122194
@dataclass
123195
class Add:
@@ -151,13 +223,13 @@ async def __call__(self):
151223
class FbaCli:
152224
version: Annotated[
153225
bool,
154-
cappa.Arg(short='-V', long=True, default=False, help='打印当前版本号'),
226+
cappa.Arg(short='-V', long=True, default=False, show_default=False, help='打印当前版本号'),
155227
]
156228
sql: Annotated[
157229
str,
158-
cappa.Arg(long=True, default='', help='在事务中执行 SQL 脚本'),
230+
cappa.Arg(value_name='PATH', long=True, default='', show_default=False, help='在事务中执行 SQL 脚本'),
159231
]
160-
subcmd: cappa.Subcommands[Run | Add | None] = None
232+
subcmd: cappa.Subcommands[Run | Celery | Add | None] = None
161233

162234
async def __call__(self):
163235
if self.version:

0 commit comments

Comments
 (0)