Как сохранить веб-сокет живым во время обработки данных? - PullRequest
0 голосов
/ 15 июня 2019

Я подключаю сервер веб-сокета и запрашиваю у него данные, проблема, с которой я сталкиваюсь, заключается в следующем:

  1. сервер веб-сокета отправляет мне сообщение каждые 10 секунд, и я должен ответитькак только я получу это сообщение.

  2. Когда я обрабатываю полученные данные с сервера, мне требуется гораздо больше 10 секунд, скажем, мне нужно около 5 минут для обработки всех полученных данных.

  3. У меня есть цикл, который делает цикл: сначала получает данные от подключения к веб-сокету, затем обрабатывает на локальных компьютерах (что занимает много времени), отправляет другой запрос и получает новые данные из подключения к веб-сокету и т. Д.вкл.

Я хочу сохранить подключение к веб-сокету, но интервал, на который мне нужно ответить серверу, составляет около 10 с, что намного меньше, чем время, необходимое для обработки данных. Как это сделать?Я делаю?

Следующий псевдо-код объясняет приведенное выше утверждение:

import websocket 
import time

ws = websocket.WebSocket() 
ws.connect("wss://example.com")


def keep_alive():
    # this is what I need to interact to keep the connection on
    while True:
        data_recvd = ws.recv()  # suppose the received data is always an integer
        if data_recvd > 1000:
            ws.send(data_recvd)


def process_data(data):
    # suppose the processing takes very long time
    print(data)
    time.sleep(300)
    pass


for i in range(100):
    ws.send("message %d" % i)
    data = ws.recv()
    if data < 1000:
        process_data(data)  # if I write the program like this, the connection will be lost.

1 Ответ

1 голос
/ 15 июня 2019

Я думаю, что ваш псевдокод немного сложнее, чем должен быть. Я напишу свою версию решения этой проблемы с использованием JavaScript (и вы должны указать порт).

const ws = new WebSocket("wss://example.com:80");
ws.onMessage = function(event){
   ws.send("Hello, server");
   executeAsync(longFunction());       
}
function longFunction(){
//timeout 5 min
}

Все, что вам нужно сделать, это создать новый поток (запустите вашу длинную функцию async). Когда longFunction завершится, поток закроется, и вы вернетесь к бесконечному циклу (в моем фрагменте кода ws.onMessage прослушивает сообщения сервера бесконечно). Но через некоторое время у вас будет столько же потоков, сколько и сообщений, отправленных сервером, поэтому будьте осторожны с созданием потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...