Skip to content

Оптимизировать код WebSocket сервера web/server.py#8

Merged
andchir merged 3 commits intoandchir:mainfrom
konard:issue-7-96acaa57ca85
Feb 6, 2026
Merged

Оптимизировать код WebSocket сервера web/server.py#8
andchir merged 3 commits intoandchir:mainfrom
konard:issue-7-96acaa57ca85

Conversation

@konard
Copy link
Copy Markdown
Contributor

@konard konard commented Feb 6, 2026

📋 Описание изменений / Changes Description

Этот PR решает issue #7 — оптимизация кода WebSocket сервера web/server.py.

This PR solves issue #7 — optimization of the WebSocket server code web/server.py.

✅ Реализованные оптимизации / Implemented Optimizations

  1. O(1) очистка при отключении вместо O(n) линейного поиска

    • Добавлен обратный маппинг WS_TO_KEY (websocket id → key) для мгновенного поиска ключа при отключении клиента
    • Ранее при отключении клиента после назначения UUID код выполнял линейный поиск (for key, con in CONNECTIONS.items()) по всем соединениям — O(n) на каждое отключение
    • Теперь используется _remove_connection_by_ws() с O(1) обратным поиском через WS_TO_KEY
  2. Вынесение управления соединениями в вспомогательные функции

    • _add_connection() — регистрация с поддержкой обоих маппингов
    • _remove_connection_by_key() — удаление по ключу из обоих маппингов
    • _remove_connection_by_ws() — удаление по websocket с O(1) обратным поиском
    • Консистентное обновление обоих словарей, исключение рассинхронизации
  3. Вынесение парсинга сообщений в _parse_message()

    • Улучшена тестируемость и читаемость логики обработки сообщений
  4. Исправлен ping_timeout (30с вместо 90с)

    • Ранее ping_timeout=90 > ping_interval=60, что означало наложение циклов ping/timeout
    • Теперь ping_timeout=30 < ping_interval=60, как рекомендуется документацией websockets
  5. Использование dict.get()/dict.pop() вместо in + del

    • Более безопасный подход, исключающий возможные проблемы при конкурентном доступе
    • Убирает избыточные поиски по словарю
  6. Удалён неиспользуемый import os

🧪 Тестирование / Testing

Добавлено 23 юнит-теста в tests/test_ws_server.py:

  • TestWebSocketMessage — тесты dataclass WebSocketMessage
  • TestParseMessage — тесты парсинга сообщений (JSON, plain text, невалидный JSON)
  • TestConnectionManagement — тесты добавления/удаления соединений, UUID переназначения, O(1) обратного поиска
  • TestRegisterHandler — тесты async handler register (приветствие, подключение, пересылка, ошибки)
  • TestPingTimeout — верификация ping_timeout < ping_interval

Все 25 тестов проходят (23 новых + 2 существующих верификационных).


Fixes #7

🤖 Generated with Claude Code

konard and others added 2 commits February 6, 2026 21:58
Adding CLAUDE.md with task information for AI processing.
This file will be removed when the task is complete.

Issue: andchir#7
- Add O(1) reverse lookup (WS_TO_KEY) for disconnect cleanup instead of
  O(n) linear scan through CONNECTIONS dict
- Extract connection management into helper functions (_add_connection,
  _remove_connection_by_key, _remove_connection_by_ws) for consistent
  dual-map maintenance
- Extract message parsing into _parse_message for clarity and testability
- Fix ping_timeout (30s) to be less than ping_interval (60s), preventing
  overlapping ping/timeout cycles per websockets library recommendations
- Use dict.get() and dict.pop() instead of `in` + `del` to avoid
  potential race conditions and redundant lookups
- Remove unused `import os`
- Add comprehensive unit tests (23 tests) covering message parsing,
  connection lifecycle, and the register handler

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@konard konard changed the title [WIP] Оптимизировать код WebSocket сервера web/server.py Оптимизировать код WebSocket сервера web/server.py Feb 6, 2026
@konard konard marked this pull request as ready for review February 6, 2026 21:08
@konard
Copy link
Copy Markdown
Contributor Author

konard commented Feb 6, 2026

🤖 Solution Draft Log

This log file contains the complete execution trace of the AI solution draft process.

💰 Cost estimation:

  • Public pricing estimate: $3.529913 USD
  • Calculated by Anthropic: $2.177461 USD
  • Difference: $-1.352452 (-38.31%)
    📎 Log file uploaded as Gist (529KB)
    🔗 View complete solution draft log

Now working session is ended, feel free to review and add any feedback on the solution draft.

@andchir andchir merged commit c10b05c into andchir:main Feb 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Оптимизировать код WebSocket сервера web/server.py

2 participants