jettask 0.2.19__py3-none-any.whl → 0.2.23__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- jettask/__init__.py +12 -3
- jettask/cli.py +314 -228
- jettask/config/__init__.py +9 -1
- jettask/config/config.py +245 -0
- jettask/config/env_loader.py +381 -0
- jettask/config/lua_scripts.py +158 -0
- jettask/config/nacos_config.py +132 -5
- jettask/core/__init__.py +1 -1
- jettask/core/app.py +1573 -666
- jettask/core/app_importer.py +33 -16
- jettask/core/container.py +532 -0
- jettask/core/task.py +1 -4
- jettask/core/unified_manager_base.py +2 -2
- jettask/executor/__init__.py +38 -0
- jettask/executor/core.py +625 -0
- jettask/executor/executor.py +338 -0
- jettask/executor/orchestrator.py +290 -0
- jettask/executor/process_entry.py +638 -0
- jettask/executor/task_executor.py +317 -0
- jettask/messaging/__init__.py +68 -0
- jettask/messaging/event_pool.py +2188 -0
- jettask/messaging/reader.py +519 -0
- jettask/messaging/registry.py +266 -0
- jettask/messaging/scanner.py +369 -0
- jettask/messaging/sender.py +312 -0
- jettask/persistence/__init__.py +118 -0
- jettask/persistence/backlog_monitor.py +567 -0
- jettask/{backend/data_access.py → persistence/base.py} +58 -57
- jettask/persistence/consumer.py +315 -0
- jettask/{core → persistence}/db_manager.py +23 -22
- jettask/persistence/maintenance.py +81 -0
- jettask/persistence/message_consumer.py +259 -0
- jettask/{backend/namespace_data_access.py → persistence/namespace.py} +66 -98
- jettask/persistence/offline_recovery.py +196 -0
- jettask/persistence/queue_discovery.py +215 -0
- jettask/persistence/task_persistence.py +218 -0
- jettask/persistence/task_updater.py +583 -0
- jettask/scheduler/__init__.py +2 -2
- jettask/scheduler/loader.py +6 -5
- jettask/scheduler/run_scheduler.py +1 -1
- jettask/scheduler/scheduler.py +7 -7
- jettask/scheduler/{unified_scheduler_manager.py → scheduler_coordinator.py} +18 -13
- jettask/task/__init__.py +16 -0
- jettask/{router.py → task/router.py} +26 -8
- jettask/task/task_center/__init__.py +9 -0
- jettask/task/task_executor.py +318 -0
- jettask/task/task_registry.py +291 -0
- jettask/test_connection_monitor.py +73 -0
- jettask/utils/__init__.py +31 -1
- jettask/{monitor/run_backlog_collector.py → utils/backlog_collector.py} +1 -1
- jettask/utils/db_connector.py +1629 -0
- jettask/{db_init.py → utils/db_init.py} +1 -1
- jettask/utils/rate_limit/__init__.py +30 -0
- jettask/utils/rate_limit/concurrency_limiter.py +665 -0
- jettask/utils/rate_limit/config.py +145 -0
- jettask/utils/rate_limit/limiter.py +41 -0
- jettask/utils/rate_limit/manager.py +269 -0
- jettask/utils/rate_limit/qps_limiter.py +154 -0
- jettask/utils/rate_limit/task_limiter.py +384 -0
- jettask/utils/serializer.py +3 -0
- jettask/{monitor/stream_backlog_monitor.py → utils/stream_backlog.py} +14 -6
- jettask/utils/time_sync.py +173 -0
- jettask/webui/__init__.py +27 -0
- jettask/{api/v1 → webui/api}/alerts.py +1 -1
- jettask/{api/v1 → webui/api}/analytics.py +2 -2
- jettask/{api/v1 → webui/api}/namespaces.py +1 -1
- jettask/{api/v1 → webui/api}/overview.py +1 -1
- jettask/{api/v1 → webui/api}/queues.py +3 -3
- jettask/{api/v1 → webui/api}/scheduled.py +1 -1
- jettask/{api/v1 → webui/api}/settings.py +1 -1
- jettask/{api.py → webui/app.py} +253 -145
- jettask/webui/namespace_manager/__init__.py +10 -0
- jettask/{multi_namespace_consumer.py → webui/namespace_manager/multi.py} +69 -22
- jettask/{unified_consumer_manager.py → webui/namespace_manager/unified.py} +1 -1
- jettask/{run.py → webui/run.py} +2 -2
- jettask/{services → webui/services}/__init__.py +1 -3
- jettask/{services → webui/services}/overview_service.py +34 -16
- jettask/{services → webui/services}/queue_service.py +1 -1
- jettask/{backend → webui/services}/queue_stats_v2.py +1 -1
- jettask/{services → webui/services}/settings_service.py +1 -1
- jettask/worker/__init__.py +53 -0
- jettask/worker/lifecycle.py +1507 -0
- jettask/worker/manager.py +583 -0
- jettask/{core/offline_worker_recovery.py → worker/recovery.py} +268 -175
- {jettask-0.2.19.dist-info → jettask-0.2.23.dist-info}/METADATA +2 -71
- jettask-0.2.23.dist-info/RECORD +145 -0
- jettask/__main__.py +0 -140
- jettask/api/__init__.py +0 -103
- jettask/backend/__init__.py +0 -1
- jettask/backend/api/__init__.py +0 -3
- jettask/backend/api/v1/__init__.py +0 -17
- jettask/backend/api/v1/monitoring.py +0 -431
- jettask/backend/api/v1/namespaces.py +0 -504
- jettask/backend/api/v1/queues.py +0 -342
- jettask/backend/api/v1/tasks.py +0 -367
- jettask/backend/core/__init__.py +0 -3
- jettask/backend/core/cache.py +0 -221
- jettask/backend/core/database.py +0 -200
- jettask/backend/core/exceptions.py +0 -102
- jettask/backend/dependencies.py +0 -261
- jettask/backend/init_meta_db.py +0 -158
- jettask/backend/main.py +0 -1426
- jettask/backend/main_unified.py +0 -78
- jettask/backend/main_v2.py +0 -394
- jettask/backend/models/__init__.py +0 -3
- jettask/backend/models/requests.py +0 -236
- jettask/backend/models/responses.py +0 -230
- jettask/backend/namespace_api_old.py +0 -267
- jettask/backend/services/__init__.py +0 -3
- jettask/backend/start.py +0 -42
- jettask/backend/unified_api_router.py +0 -1541
- jettask/cleanup_deprecated_tables.sql +0 -16
- jettask/core/consumer_manager.py +0 -1695
- jettask/core/delay_scanner.py +0 -256
- jettask/core/event_pool.py +0 -1700
- jettask/core/heartbeat_process.py +0 -222
- jettask/core/task_batch.py +0 -153
- jettask/core/worker_scanner.py +0 -271
- jettask/executors/__init__.py +0 -5
- jettask/executors/asyncio.py +0 -876
- jettask/executors/base.py +0 -30
- jettask/executors/common.py +0 -148
- jettask/executors/multi_asyncio.py +0 -309
- jettask/gradio_app.py +0 -570
- jettask/integrated_gradio_app.py +0 -1088
- jettask/main.py +0 -0
- jettask/monitoring/__init__.py +0 -3
- jettask/pg_consumer.py +0 -1896
- jettask/run_monitor.py +0 -22
- jettask/run_webui.py +0 -148
- jettask/scheduler/multi_namespace_scheduler.py +0 -294
- jettask/scheduler/unified_manager.py +0 -450
- jettask/task_center_client.py +0 -150
- jettask/utils/serializer_optimized.py +0 -33
- jettask/webui_exceptions.py +0 -67
- jettask-0.2.19.dist-info/RECORD +0 -150
- /jettask/{constants.py → config/constants.py} +0 -0
- /jettask/{backend/config.py → config/task_center.py} +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/pg_consumer_v2.py +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/sql/add_execution_time_field.sql +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/sql/create_new_tables.sql +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/sql/create_tables_v3.sql +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/sql/migrate_to_new_structure.sql +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/sql/modify_time_fields.sql +0 -0
- /jettask/{pg_consumer → messaging/pg_consumer}/sql_utils.py +0 -0
- /jettask/{models.py → persistence/models.py} +0 -0
- /jettask/scheduler/{manager.py → task_crud.py} +0 -0
- /jettask/{schema.sql → schemas/schema.sql} +0 -0
- /jettask/{task_center.py → task/task_center/client.py} +0 -0
- /jettask/{monitoring → utils}/file_watcher.py +0 -0
- /jettask/{services/redis_monitor_service.py → utils/redis_monitor.py} +0 -0
- /jettask/{api/v1 → webui/api}/__init__.py +0 -0
- /jettask/{webui_config.py → webui/config.py} +0 -0
- /jettask/{webui_models → webui/models}/__init__.py +0 -0
- /jettask/{webui_models → webui/models}/namespace.py +0 -0
- /jettask/{services → webui/services}/alert_service.py +0 -0
- /jettask/{services → webui/services}/analytics_service.py +0 -0
- /jettask/{services → webui/services}/scheduled_task_service.py +0 -0
- /jettask/{services → webui/services}/task_service.py +0 -0
- /jettask/{webui_sql → webui/sql}/batch_upsert_functions.sql +0 -0
- /jettask/{webui_sql → webui/sql}/verify_database.sql +0 -0
- {jettask-0.2.19.dist-info → jettask-0.2.23.dist-info}/WHEEL +0 -0
- {jettask-0.2.19.dist-info → jettask-0.2.23.dist-info}/entry_points.txt +0 -0
- {jettask-0.2.19.dist-info → jettask-0.2.23.dist-info}/licenses/LICENSE +0 -0
- {jettask-0.2.19.dist-info → jettask-0.2.23.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,291 @@
|
|
1
|
+
"""
|
2
|
+
任务注册器
|
3
|
+
|
4
|
+
统一管理所有任务定义
|
5
|
+
"""
|
6
|
+
|
7
|
+
from typing import Dict, Callable, Optional, Any, Set
|
8
|
+
from dataclasses import dataclass, field
|
9
|
+
import logging
|
10
|
+
|
11
|
+
logger = logging.getLogger('app')
|
12
|
+
|
13
|
+
|
14
|
+
@dataclass
|
15
|
+
class TaskDefinition:
|
16
|
+
"""任务定义"""
|
17
|
+
name: str
|
18
|
+
func: Callable
|
19
|
+
queue: str = 'default'
|
20
|
+
max_retries: int = 3
|
21
|
+
timeout: int = 300
|
22
|
+
retry_delay: int = 60
|
23
|
+
priority: int = 0
|
24
|
+
options: dict = field(default_factory=dict)
|
25
|
+
|
26
|
+
def __post_init__(self):
|
27
|
+
"""验证任务定义"""
|
28
|
+
if not self.name:
|
29
|
+
raise ValueError("Task name cannot be empty")
|
30
|
+
if not callable(self.func):
|
31
|
+
raise ValueError("Task func must be callable")
|
32
|
+
if self.timeout <= 0:
|
33
|
+
raise ValueError("Task timeout must be positive")
|
34
|
+
|
35
|
+
|
36
|
+
class TaskRegistry:
|
37
|
+
"""
|
38
|
+
任务注册器
|
39
|
+
|
40
|
+
职责:
|
41
|
+
1. 任务注册和注销(本地内存)
|
42
|
+
2. 任务查找
|
43
|
+
3. 任务元数据管理
|
44
|
+
4. Redis 任务注册(用于分布式发现)
|
45
|
+
|
46
|
+
整合了:
|
47
|
+
- TaskCenter的注册功能
|
48
|
+
- RegistryManager的任务注册功能
|
49
|
+
"""
|
50
|
+
|
51
|
+
def __init__(self, redis_client=None, async_redis_client=None, redis_prefix: str = 'jettask'):
|
52
|
+
"""初始化任务注册器
|
53
|
+
|
54
|
+
Args:
|
55
|
+
redis_client: 同步 Redis 客户端(可选,用于分布式注册)
|
56
|
+
async_redis_client: 异步 Redis 客户端(可选,用于分布式注册)
|
57
|
+
redis_prefix: Redis 键前缀
|
58
|
+
"""
|
59
|
+
self.tasks: Dict[str, TaskDefinition] = {}
|
60
|
+
self.redis = redis_client
|
61
|
+
self.async_redis = async_redis_client
|
62
|
+
self.redis_prefix = redis_prefix
|
63
|
+
self.tasks_registry_key = f"{redis_prefix}:REGISTRY:TASKS"
|
64
|
+
logger.debug("TaskRegistry initialized")
|
65
|
+
|
66
|
+
def register(self,
|
67
|
+
name: str,
|
68
|
+
func: Callable,
|
69
|
+
queue: str = 'default',
|
70
|
+
**options) -> TaskDefinition:
|
71
|
+
"""
|
72
|
+
注册任务
|
73
|
+
|
74
|
+
Args:
|
75
|
+
name: 任务名称
|
76
|
+
func: 任务函数
|
77
|
+
queue: 队列名称
|
78
|
+
**options: 其他选项
|
79
|
+
- max_retries: 最大重试次数
|
80
|
+
- timeout: 超时时间(秒)
|
81
|
+
- retry_delay: 重试延迟(秒)
|
82
|
+
- priority: 优先级
|
83
|
+
|
84
|
+
Returns:
|
85
|
+
TaskDefinition: 任务定义
|
86
|
+
"""
|
87
|
+
task_def = TaskDefinition(
|
88
|
+
name=name,
|
89
|
+
func=func,
|
90
|
+
queue=queue,
|
91
|
+
max_retries=options.get('max_retries', 3),
|
92
|
+
timeout=options.get('timeout', 300),
|
93
|
+
retry_delay=options.get('retry_delay', 60),
|
94
|
+
priority=options.get('priority', 0),
|
95
|
+
options=options
|
96
|
+
)
|
97
|
+
|
98
|
+
self.tasks[name] = task_def
|
99
|
+
logger.info(f"Task registered: {name} -> queue: {queue}")
|
100
|
+
|
101
|
+
return task_def
|
102
|
+
|
103
|
+
def unregister(self, name: str) -> bool:
|
104
|
+
"""
|
105
|
+
注销任务
|
106
|
+
|
107
|
+
Args:
|
108
|
+
name: 任务名称
|
109
|
+
|
110
|
+
Returns:
|
111
|
+
bool: 是否成功注销
|
112
|
+
"""
|
113
|
+
if name in self.tasks:
|
114
|
+
del self.tasks[name]
|
115
|
+
logger.info(f"Task unregistered: {name}")
|
116
|
+
return True
|
117
|
+
|
118
|
+
logger.warning(f"Task not found for unregister: {name}")
|
119
|
+
return False
|
120
|
+
|
121
|
+
def get(self, name: str) -> Optional[TaskDefinition]:
|
122
|
+
"""
|
123
|
+
获取任务定义
|
124
|
+
|
125
|
+
Args:
|
126
|
+
name: 任务名称
|
127
|
+
|
128
|
+
Returns:
|
129
|
+
Optional[TaskDefinition]: 任务定义,不存在返回None
|
130
|
+
"""
|
131
|
+
return self.tasks.get(name)
|
132
|
+
|
133
|
+
def exists(self, name: str) -> bool:
|
134
|
+
"""
|
135
|
+
检查任务是否存在
|
136
|
+
|
137
|
+
Args:
|
138
|
+
name: 任务名称
|
139
|
+
|
140
|
+
Returns:
|
141
|
+
bool: 是否存在
|
142
|
+
"""
|
143
|
+
return name in self.tasks
|
144
|
+
|
145
|
+
def list_all(self) -> Dict[str, TaskDefinition]:
|
146
|
+
"""
|
147
|
+
列出所有任务
|
148
|
+
|
149
|
+
Returns:
|
150
|
+
Dict[str, TaskDefinition]: 任务定义字典
|
151
|
+
"""
|
152
|
+
return self.tasks.copy()
|
153
|
+
|
154
|
+
def list_by_queue(self, queue: str) -> Dict[str, TaskDefinition]:
|
155
|
+
"""
|
156
|
+
列出指定队列的所有任务
|
157
|
+
|
158
|
+
Args:
|
159
|
+
queue: 队列名称
|
160
|
+
|
161
|
+
Returns:
|
162
|
+
Dict[str, TaskDefinition]: 任务定义字典
|
163
|
+
"""
|
164
|
+
return {
|
165
|
+
name: task_def
|
166
|
+
for name, task_def in self.tasks.items()
|
167
|
+
if task_def.queue == queue
|
168
|
+
}
|
169
|
+
|
170
|
+
def update_options(self, name: str, **options) -> bool:
|
171
|
+
"""
|
172
|
+
更新任务选项
|
173
|
+
|
174
|
+
Args:
|
175
|
+
name: 任务名称
|
176
|
+
**options: 要更新的选项
|
177
|
+
|
178
|
+
Returns:
|
179
|
+
bool: 是否成功更新
|
180
|
+
"""
|
181
|
+
if name not in self.tasks:
|
182
|
+
logger.warning(f"Task not found for update: {name}")
|
183
|
+
return False
|
184
|
+
|
185
|
+
task_def = self.tasks[name]
|
186
|
+
|
187
|
+
# 更新可修改的选项
|
188
|
+
if 'max_retries' in options:
|
189
|
+
task_def.max_retries = options['max_retries']
|
190
|
+
if 'timeout' in options:
|
191
|
+
task_def.timeout = options['timeout']
|
192
|
+
if 'retry_delay' in options:
|
193
|
+
task_def.retry_delay = options['retry_delay']
|
194
|
+
if 'priority' in options:
|
195
|
+
task_def.priority = options['priority']
|
196
|
+
if 'queue' in options:
|
197
|
+
task_def.queue = options['queue']
|
198
|
+
|
199
|
+
# 更新options字典
|
200
|
+
task_def.options.update(options)
|
201
|
+
|
202
|
+
logger.info(f"Task options updated: {name}")
|
203
|
+
return True
|
204
|
+
|
205
|
+
def get_task_info(self, name: str) -> Optional[Dict[str, Any]]:
|
206
|
+
"""
|
207
|
+
获取任务信息(不包含函数对象)
|
208
|
+
|
209
|
+
Args:
|
210
|
+
name: 任务名称
|
211
|
+
|
212
|
+
Returns:
|
213
|
+
Optional[Dict]: 任务信息字典
|
214
|
+
"""
|
215
|
+
task_def = self.get(name)
|
216
|
+
if not task_def:
|
217
|
+
return None
|
218
|
+
|
219
|
+
return {
|
220
|
+
'name': task_def.name,
|
221
|
+
'queue': task_def.queue,
|
222
|
+
'max_retries': task_def.max_retries,
|
223
|
+
'timeout': task_def.timeout,
|
224
|
+
'retry_delay': task_def.retry_delay,
|
225
|
+
'priority': task_def.priority,
|
226
|
+
'options': task_def.options
|
227
|
+
}
|
228
|
+
|
229
|
+
def count(self) -> int:
|
230
|
+
"""
|
231
|
+
获取注册的任务数量
|
232
|
+
|
233
|
+
Returns:
|
234
|
+
int: 任务数量
|
235
|
+
"""
|
236
|
+
return len(self.tasks)
|
237
|
+
|
238
|
+
def clear(self):
|
239
|
+
"""清空所有任务注册"""
|
240
|
+
count = len(self.tasks)
|
241
|
+
self.tasks.clear()
|
242
|
+
logger.info(f"TaskRegistry cleared, {count} tasks removed")
|
243
|
+
|
244
|
+
# ========== Redis 分布式注册功能(从 registry/manager.py 迁移) ==========
|
245
|
+
|
246
|
+
async def register_task_to_redis(self, task_name: str):
|
247
|
+
"""注册任务到 Redis(用于分布式发现)
|
248
|
+
|
249
|
+
Args:
|
250
|
+
task_name: 任务名称
|
251
|
+
"""
|
252
|
+
if not self.async_redis:
|
253
|
+
logger.warning("Redis client not configured, skipping Redis registration")
|
254
|
+
return
|
255
|
+
|
256
|
+
await self.async_redis.sadd(self.tasks_registry_key, task_name)
|
257
|
+
logger.debug(f"Registered task to Redis: {task_name}")
|
258
|
+
|
259
|
+
async def unregister_task_from_redis(self, task_name: str):
|
260
|
+
"""从 Redis 注销任务
|
261
|
+
|
262
|
+
Args:
|
263
|
+
task_name: 任务名称
|
264
|
+
"""
|
265
|
+
if not self.async_redis:
|
266
|
+
return
|
267
|
+
|
268
|
+
await self.async_redis.srem(self.tasks_registry_key, task_name)
|
269
|
+
logger.debug(f"Unregistered task from Redis: {task_name}")
|
270
|
+
|
271
|
+
async def get_all_tasks_from_redis(self) -> Set[str]:
|
272
|
+
"""从 Redis 获取所有任务(不使用 SCAN)
|
273
|
+
|
274
|
+
Returns:
|
275
|
+
Set[str]: 任务名称集合
|
276
|
+
"""
|
277
|
+
if not self.async_redis:
|
278
|
+
return set()
|
279
|
+
|
280
|
+
return await self.async_redis.smembers(self.tasks_registry_key)
|
281
|
+
|
282
|
+
async def get_task_count_from_redis(self) -> int:
|
283
|
+
"""从 Redis 获取任务数量
|
284
|
+
|
285
|
+
Returns:
|
286
|
+
int: 任务数量
|
287
|
+
"""
|
288
|
+
if not self.async_redis:
|
289
|
+
return 0
|
290
|
+
|
291
|
+
return await self.async_redis.scard(self.tasks_registry_key)
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
"""
|
3
|
+
测试 Redis 连接监控功能
|
4
|
+
"""
|
5
|
+
import time
|
6
|
+
import logging
|
7
|
+
from jettask.utils.db_connector import (
|
8
|
+
get_sync_redis_client,
|
9
|
+
get_async_redis_client,
|
10
|
+
start_connection_monitor,
|
11
|
+
stop_connection_monitor,
|
12
|
+
print_connection_stats,
|
13
|
+
)
|
14
|
+
|
15
|
+
# 配置日志
|
16
|
+
logging.basicConfig(
|
17
|
+
level=logging.INFO,
|
18
|
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
19
|
+
)
|
20
|
+
|
21
|
+
def test_connection_monitor():
|
22
|
+
"""测试连接监控功能"""
|
23
|
+
print("=" * 80)
|
24
|
+
print("测试 Redis 连接监控功能")
|
25
|
+
print("=" * 80)
|
26
|
+
|
27
|
+
# 启动监控(间隔10秒,用于测试)
|
28
|
+
print("\n1. 启动连接监控(间隔10秒)...")
|
29
|
+
start_connection_monitor(interval=10)
|
30
|
+
time.sleep(2)
|
31
|
+
|
32
|
+
# 创建一些连接
|
33
|
+
print("\n2. 创建同步客户端(文本模式)...")
|
34
|
+
sync_client1 = get_sync_redis_client('redis://localhost:6379/0', decode_responses=True)
|
35
|
+
time.sleep(1)
|
36
|
+
|
37
|
+
print("\n3. 创建同步客户端(二进制模式)...")
|
38
|
+
sync_client2 = get_sync_redis_client('redis://localhost:6379/0', decode_responses=False)
|
39
|
+
time.sleep(1)
|
40
|
+
|
41
|
+
print("\n4. 创建异步客户端(文本模式)...")
|
42
|
+
async_client1 = get_async_redis_client('redis://localhost:6379/0', decode_responses=True)
|
43
|
+
time.sleep(1)
|
44
|
+
|
45
|
+
print("\n5. 创建异步客户端(二进制模式)...")
|
46
|
+
async_client2 = get_async_redis_client('redis://localhost:6379/0', decode_responses=False)
|
47
|
+
time.sleep(1)
|
48
|
+
|
49
|
+
# 手动打印一次统计信息
|
50
|
+
print("\n6. 手动打印连接统计信息...")
|
51
|
+
print_connection_stats()
|
52
|
+
|
53
|
+
# 测试客户端复用
|
54
|
+
print("\n7. 测试客户端复用(获取相同URL的客户端)...")
|
55
|
+
sync_client3 = get_sync_redis_client('redis://localhost:6379/0', decode_responses=True)
|
56
|
+
print(f" 客户端是否相同: {sync_client1 is sync_client3}")
|
57
|
+
|
58
|
+
# 等待一个监控周期
|
59
|
+
print("\n8. 等待监控线程自动输出(10秒)...")
|
60
|
+
time.sleep(12)
|
61
|
+
|
62
|
+
# 停止监控
|
63
|
+
print("\n9. 停止连接监控...")
|
64
|
+
stop_connection_monitor()
|
65
|
+
time.sleep(1)
|
66
|
+
|
67
|
+
print("\n" + "=" * 80)
|
68
|
+
print("测试完成!")
|
69
|
+
print("=" * 80)
|
70
|
+
|
71
|
+
|
72
|
+
if __name__ == "__main__":
|
73
|
+
test_connection_monitor()
|
jettask/utils/__init__.py
CHANGED
@@ -1,3 +1,33 @@
|
|
1
1
|
from .helpers import get_hostname, gen_task_name, is_async_function
|
2
|
+
from .db_connector import (
|
3
|
+
# 全局连接池函数(推荐使用)
|
4
|
+
get_sync_redis_pool,
|
5
|
+
get_async_redis_pool,
|
6
|
+
get_pg_engine_and_factory,
|
7
|
+
# 客户端实例函数
|
8
|
+
get_sync_redis_client,
|
9
|
+
get_async_redis_client,
|
10
|
+
get_dual_mode_async_redis_client,
|
11
|
+
# 配置解析
|
12
|
+
DBConfig,
|
13
|
+
)
|
14
|
+
from .file_watcher import FileChangeHandler
|
15
|
+
from .task_logger import get_task_logger
|
2
16
|
|
3
|
-
__all__ = [
|
17
|
+
__all__ = [
|
18
|
+
"get_hostname",
|
19
|
+
"gen_task_name",
|
20
|
+
"is_async_function",
|
21
|
+
# 全局连接池函数(推荐使用)
|
22
|
+
"get_sync_redis_pool",
|
23
|
+
"get_async_redis_pool",
|
24
|
+
"get_pg_engine_and_factory",
|
25
|
+
# 客户端实例函数
|
26
|
+
"get_sync_redis_client",
|
27
|
+
"get_async_redis_client",
|
28
|
+
"get_dual_mode_async_redis_client",
|
29
|
+
# 数据库连接工具
|
30
|
+
"DBConfig",
|
31
|
+
"FileChangeHandler",
|
32
|
+
"get_task_logger",
|
33
|
+
]
|