Задать вопрос
@Progrimer

Как оптимизировать сервер на python?

Люди, подскажите, как можно улучшить код, чтобы данные с сервера к клиенту предавались быстрее:
Сервер:
import socket
from pickle import dumps
import torch

srv=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind(('...', 99))
print('Working...')
srv.listen(100)

while True:
    try:
        client_socket, address=srv.accept()
        #ПОЛУЧАЕМ ТЕКСТ
        text=client_socket.recv(1024).decode('utf-8')
        #РЕЧЬ: ПАРАМЕТРЫ
        device=torch.device('cpu')
        model, _=torch.hub.load(repo_or_dir='snakers4/silero-models',
                                model='silero_tts',
                                language='ru',
                                speaker='ru_v3')
        model.to(device)
        #РЕЧЬ: СИНТЕЗ
        audio = model.apply_tts(text=text,
                                speaker='baya',
                                sample_rate=48000,
                                put_accent=True,
                                put_yo=True)
        #ПОДГОТОВКА К ОТПРАВКЕ
        audio=dumps(audio)
        #ОТПРАВКА РАЗМЕРА АУДИО
        client_socket.sendall(bytes(str(len(audio)), 'utf-8'))
        #РАЗДЕЛЕНИЕ ОТПРАВОК
        client_socket.recv(20)
        #ОТПРАВКА АУДИО
        client_socket.sendall(audio)
        client_socket.close()
    except:
        pass

Клиент:
import socket
from sounddevice import play, stop
from pickle import loads
from time import sleep

while True:
    text=input('Enter text with a maximum of 700 characters(russians):')
    client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.settimeout(10)
    client.connect(('...', 99))
    #ОТПРАВЛЯЕМ ТЕКСТ
    client.sendall(bytes(text, 'utf-8'))
    #ПОЛУЧАЕМ РАЗМЕР АУДИО
    size=int(client.recv(1024).decode('utf-8'))
    #РАЗДЕЛЕНИЕ ПОЛУЧЕНИЙ
    client.sendall(bytes('-', 'utf-8'))
    #ПОЛУЧАЕМ АУДИО
    print(f'----{size}')
    received_data = b''
    while len(received_data)<size:
        data = client.recv(10000)
        received_data += data
    print(f'----{len(received_data)}')
    #ПОДГОТОВКА К ВОСПРОИЗВЕДЕНИЮ(получаем то аудио, котрое было до преобразования функцией dumps(на сервере- подготовка к отправке))
    audio=loads(received_data)
    #ВОСПРОИЗВОДИМ
    play(audio, 50000)
    #ЖДЕМ
    sleep(len(audio)/50000)
  • Вопрос задан
  • 202 просмотра
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
Mike_Ro
@Mike_Ro Куратор тега Python
Python, JS, WordPress, SEO, Bots, Adversting
как можно улучшить код, чтобы данные с сервера к клиенту предавались быстрее

Я бы использовал следующее:
- Асинхронность с Asyncio.
- Сжимать аудио перед отправкой на клиент.

Если я правильно понимаю, Вы используете новое соединение для каждого запроса? Может лучше постоянное?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
В первую очередь нужно всё измерить. Просто методом тыка оптимизировать плохая идея, ведь вы не знаете какие места представляют "бутылочные горлышки".
Нужно добавить логирование с замерами времени разных этапов.
У вас все этапы выстроены друг за другом и пока происходит один этап больше ничего не происходит. Можно сформировать конвейер и разнести те задачи, какие можно по процессам. Для этого есть, например, очереди.
Вы каждый раз загружаете модель, а это можно сделать лишь один раз вынеся за пределы цикла.

Вот смотрю и вижу, что ваша задача очень похожа на задание. Если вы это написали самостоятельно, то должны были бы уже догадываться что с этим кодом не так. А так получается, что это не ваш код и вам задали вопрос как его оптимизировать, а вы пришли с этим заданием сюда. Так нельзя.
Ответ написан
LaRN
@LaRN
Senior Developer
При загрузке большого сообщения на стороне клиента у вас будет около 1000 фрагметов, судя по размеру буфера.
client.recv(10000)
Т.е. будет создано порядка 1000 новых объектов типа string. Если вместо строки использовать список и делать ему apend каждого нового фрагмента, то должно быть быстрее.
Если взять ваше время загрузки и посчитать среднее время на один фрагмент, то выходит около 7мс, тут уже время создания объекта может иметь большое значение.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы