Как можно организовать постоянную отправку сообщений в WebSocket клиенту с использованием отдельного потока?

Как можно запустить функцию, указанную в коде через комментарий, так чтобы она выполнялась параллельно с основным потоком обработки сообщений?
  • 24 ноября 2024 г. 15:53
Ответы на вопрос 2
Для организации постоянной отправки сообщений WebSocket клиенту с использованием отдельного потока в Python, можно воспользоваться библиотекой `threading` вместе с библиотекой `websockets`. Ниже приведён пример, который демонстрирует, как это можно сделать.

### Пример кода

```python
import asyncio
import websockets
import threading
import time

# Функция для отправки сообщений клиенту
async def send_messages(websocket):
    while True:
        message = "Hello from server!"
        await websocket.send(message)
        await asyncio.sleep(1)  # Интервал между сообщениями

# Функция для обработки сообщений от клиента
async def handle_client(websocket, path):
    # Запускаем отправку сообщений
    asyncio.create_task(send_messages(websocket))

    async for message in websocket:
        print(f"Received message from client: {message}")

# Главная функция для запуска сервера
async def main():
    async with websockets.serve(handle_client, "localhost", 8765):
        await asyncio.Future()  # Запускаем сервер бесконечно

# Запускаем цикл событий в отдельном потоке
def run_server():
    asyncio.run(main())

# Запускаем сервер в отдельном потоке
server_thread = threading.Thread(target=run_server)
server_thread.start()

# Здесь можно добавить другие операции в основном потоке
while True:
    print("Main thread is running...")
    time.sleep(5)  # Основной поток может выполнять другие задачи
```

### Объяснение кода

1. **Импорт библиотек**: Импортируем необходимые библиотеки `asyncio`, `websockets`, `threading` и `time`.

2. **Функция `send_messages`**: Использует бесконечный цикл для отправки сообщений с заданным интервалом (например, каждую секунду).

3. **Функция `handle_client`**: Обрабатывает подключение клиента и создает задачу для отправки сообщений. Также она обрабатывает входящие сообщения от клиента.

4. **Функция `main`**: Запускает WebSocket сервер, который принимает подключения на заданном хосте и порте.

5. **Функция `run_server`**: Запускает метод `asyncio.run`, который инициализирует и запускает цикл событий.

6. **Создание и запуск потока**: Создаётся отдельный поток для работы сервера, чтобы основной поток мог заниматься другими задачами.

7. **Основной поток**: В основном потоке можно выполнять любые другие операции, пока сервер работает в фоновом режиме.

Такой подход позволяет разделить логику работы сервера и выполнять другие действия в основном потоке, создавая более отзывчивую архитектуру.
Вот такой вариант: 
const WebSocket = require('ws')

const wsServer = new WebSocket.Server({ port: 9000 })
wsServer.on('connection', (wsClient) => {
    wsClient.on('error', console.error);
    console.log('Новый пользователь');
    wsClient.on('message', function (message) {
        console.log('Сообщение от пользователя:', message);
        wsClient.send('Данные получены...')
        wsClient._timer = setInterval(() => some_function(wsClient), 1000);

    })
    wsClient.on('close', function () {
        clearInterval(wsClient._timer);
        console.log('Пользователь отключился');
    })
})

function some_function(wsClient) {
    wsClient.send('Сообщение каждый вызов')
}

При каждом полученном сообщение - создается таймер который с заложенным интервалом (1000мс = 1 сек) выполняет функцию
Похожие вопросы