Очередь открывается при старте сервиса, а не при импорте модуля

На Windows процессы поднимаются через spawn и заново импортируют app.main.
Хранилище задач создавалось на уровне модуля, поэтому каждый новый процесс
при старте помечал чужие выполняющиеся задачи как сорванные - все три
записи падали с "сервис был перезапущен во время обработки".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Vladimir Bryzgalov
2026-08-15 23:29:38 +05:00
co-authored by Claude Opus 5
parent 41f3651cc8
commit 91b69ebe06
3 changed files with 34 additions and 2 deletions
+24
View File
@@ -257,3 +257,27 @@ class TestProcessPool:
assert "не инициализирован" in str(exc)
else:
raise AssertionError("ожидалась ошибка о неинициализированном воркере")
class TestSpawnSafety:
"""На Windows дочерний процесс заново импортирует app.main."""
def test_importing_main_does_not_open_store(self, tmp_path, monkeypatch):
"""Иначе каждый новый процесс объявлял бы чужие задачи сорванными."""
import sys
import types
config = tmp_path / "config.toml"
config.write_text('[security]\ntoken="t"\n', encoding="utf-8")
monkeypatch.setenv("TALKSCORE_ASR_HOME", str(tmp_path))
for name in ("sherpa_onnx", "onnx_asr", "onnxruntime"):
monkeypatch.setitem(sys.modules, name, types.ModuleType(name))
for mod in [m for m in list(sys.modules) if m.startswith("app.")]:
del sys.modules[mod]
import app.config as cfg
monkeypatch.setattr(cfg, "BASE_DIR", tmp_path)
import app.main as main
assert main.store is None
assert not (tmp_path / "data" / "jobs.db").exists()