e5a586f903
Move business code under modules/, env template to config/, PM2 single qihuo process, and _legacy shims for old imports. Co-authored-by: Cursor <cursoragent@cursor.com>
56 lines
1.5 KiB
Python
56 lines
1.5 KiB
Python
# Copyright (c) 2025-2026 马建军. All rights reserved.
|
|
|
|
"""Application module registry and startup wiring."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import importlib
|
|
import logging
|
|
from typing import TYPE_CHECKING, Any
|
|
|
|
if TYPE_CHECKING:
|
|
from modules.core.deps import AppDeps
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# Registration order: core services first, trading last among features.
|
|
_MODULE_NAMES = (
|
|
"modules.web",
|
|
"modules.market",
|
|
"modules.keys",
|
|
"modules.plans",
|
|
"modules.notify",
|
|
"modules.records",
|
|
"modules.stats",
|
|
"modules.fees",
|
|
"modules.backup",
|
|
"modules.settings",
|
|
"modules.risk",
|
|
"modules.strategy",
|
|
"modules.ctp",
|
|
"modules.trading",
|
|
)
|
|
|
|
|
|
def register_all_modules(deps: "AppDeps") -> None:
|
|
for name in _MODULE_NAMES:
|
|
mod = importlib.import_module(name)
|
|
register = getattr(mod, "register", None)
|
|
if not callable(register):
|
|
logger.warning("module %s has no register()", name)
|
|
continue
|
|
register(deps)
|
|
logger.debug("registered %s", name)
|
|
|
|
|
|
def start_module_workers(deps: "AppDeps") -> None:
|
|
"""Background threads owned by feature modules."""
|
|
from modules.ctp.vnpy_bridge import try_init_vnpy
|
|
|
|
try_init_vnpy({})
|
|
for name in ("modules.market",):
|
|
mod = importlib.import_module(name)
|
|
start = getattr(mod, "start_workers", None)
|
|
if callable(start):
|
|
start(deps)
|