f20080305d
Определение специфических рекомендаций (матрица профилей §8):
1. Ж/д слой (закрыт мёртвый railway ×2.5 у РАС):
- /api/v1/water/{case_id} отдаёт railway=rail как LineString
(без service/industrial/military веток), кэш общий v2;
- railway_warning «перекрыть/проверить немедленно» по профилям;
- SearchMap: Polyline слой ж/д (тёмно-красный), счётчики 💧/🚂.
2. cant_swim → профиль не_умеет_плавать (water ×3.0, без изменения
радиуса, critical_warning «обследовать водоёмы НЕМЕДЛЕННО»):
- раньше чекбокс влиял только на текст, в скоринге был пробел;
- derive в analyze._derive_profiles — работает и для closed_cases.
3. unmodeled_profiles: ДЦП/слабое зрение/слух — честная пометка
«вне поведенческой модели» с пояснением (vector_tasks B12:
профили без аналога не выдавать за учтённые); блок на фронте
в карточке здоровья.
Площадь воды: сферический эксцесс, проверен на квадрате 53° (744017 м²
vs 743272 точного). Тесты: 202 passed (новый test_cant_swim_profile).
81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
from __future__ import annotations
|
|
|
|
__all__ = (
|
|
"current_default_thread_limiter",
|
|
"run_sync",
|
|
)
|
|
|
|
import sys
|
|
from collections.abc import Callable
|
|
from typing import TYPE_CHECKING, TypeVar
|
|
from warnings import warn
|
|
|
|
from ._core._eventloop import get_async_backend
|
|
|
|
if TYPE_CHECKING:
|
|
from ._core._synchronization import CapacityLimiter
|
|
|
|
if sys.version_info >= (3, 11):
|
|
from typing import TypeVarTuple, Unpack
|
|
else:
|
|
from typing_extensions import TypeVarTuple, Unpack
|
|
|
|
T_Retval = TypeVar("T_Retval")
|
|
PosArgsT = TypeVarTuple("PosArgsT")
|
|
|
|
|
|
async def run_sync(
|
|
func: Callable[[Unpack[PosArgsT]], T_Retval],
|
|
*args: Unpack[PosArgsT],
|
|
abandon_on_cancel: bool = False,
|
|
cancellable: bool | None = None,
|
|
limiter: CapacityLimiter | None = None,
|
|
) -> T_Retval:
|
|
"""
|
|
Call the given function with the given arguments in a worker thread.
|
|
|
|
If the ``abandon_on_cancel`` option is enabled and the task waiting for its
|
|
completion is cancelled, the thread will still run its course but its
|
|
return value (or any raised exception) will be ignored.
|
|
|
|
:param func: a callable
|
|
:param args: positional arguments for the callable
|
|
:param abandon_on_cancel: ``True`` to abandon the thread (leaving it to run
|
|
unchecked on own) if the host task is cancelled, ``False`` to ignore
|
|
cancellations in the host task until the operation has completed in the worker
|
|
thread
|
|
:param cancellable: deprecated alias of ``abandon_on_cancel``; will override
|
|
``abandon_on_cancel`` if both parameters are passed
|
|
:param limiter: capacity limiter to use to limit the total amount of threads running
|
|
(if omitted, the default limiter is used)
|
|
:raises NoEventLoopError: if no supported asynchronous event loop is running in the
|
|
current thread
|
|
:return: an awaitable that yields the return value of the function.
|
|
|
|
"""
|
|
if cancellable is not None:
|
|
abandon_on_cancel = cancellable
|
|
warn(
|
|
"The `cancellable=` keyword argument to `anyio.to_thread.run_sync` is "
|
|
"deprecated since AnyIO 4.1.0; use `abandon_on_cancel=` instead",
|
|
DeprecationWarning,
|
|
stacklevel=2,
|
|
)
|
|
|
|
return await get_async_backend().run_sync_in_worker_thread(
|
|
func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter
|
|
)
|
|
|
|
|
|
def current_default_thread_limiter() -> CapacityLimiter:
|
|
"""
|
|
Return the capacity limiter that is used by default to limit the number of
|
|
concurrent threads.
|
|
|
|
:return: a capacity limiter object
|
|
:raises NoEventLoopError: if no supported asynchronous event loop is running in the
|
|
current thread
|
|
|
|
"""
|
|
return get_async_backend().current_default_thread_limiter()
|