«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Использование WebSocket с Python

Использование WebSocket с Python

Опубликовано 8 ноября 2024 г.
Просматривать:489

Using WebSocket with Python

Что такое вебсокет?

WebSocket — это протокол, обеспечивающий двунаправленную связь между браузером и сервером в режиме реального времени. Традиционная HTTP-связь предполагает, что клиент отправляет запрос, а сервер отвечает на обмен данными. Напротив, при использовании WebSocket после установления первоначального соединения и клиент, и сервер могут отправлять и получать сообщения друг другу без необходимости неоднократно устанавливать новые соединения.

В последнее время интерактивные сервисы, такие как OpenAI Realtime API и Hume AI, стали более распространенными, что привело к ожидаемому увеличению спроса на WebSocket. В этой статье представлены основы использования WebSocket, а также сведения о соответствующей асинхронной обработке.

Использование WebSocket с Python

В Python вы можете использовать WebSocket, как показано ниже:

import asyncio
import websockets

uri = "ws://..."

async def hello():
    async with websockets.connect(uri) as websocket:
        await websocket.send("Hello, Server!")
        response = await websocket.recv()
        print(f"Server says: {response}")

asyncio.run(hello())
  1. Подключитесь к серверу WebSocket с помощью websockets.connect(uri).
  2. Отправьте сообщение с помощью websocket.send(message).
  3. Получить сообщение с помощью websocket.recv().

Асинхронная обработка

Символы async и await, использованные в предыдущем коде, представляют собой асинхронную обработку. Асинхронная обработка особенно эффективна при одновременном выполнении нескольких задач.

import asyncio

async def task1():
    print("Task 1: Start")
    await asyncio.sleep(2)  # Wait for 2 seconds
    print("Task 1: End")

async def task2():
    print("Task 2: Start")
    await asyncio.sleep(1)  # Wait for 1 second
    print("Task 2: End")

async def main():
    await asyncio.gather(task1(), task2())

asyncio.run(main())

В функциях, использующих await, другие задачи могут выполняться во время ожидания завершения текущей задачи. Это позволяет эффективно переключаться между задачами.

Асинхронная обработка и многопоточность

Многопоточность также позволяет решать несколько задач, но есть разница в использовании потоков:

  • При многопоточности каждая задача имеет свой собственный поток, и программа переключается между задачами, ожидая завершения определенных процессов.
  • С другой стороны, асинхронная обработка не создает новые потоки, а переключается между задачами.

Многопоточность эффективна при работе с ресурсоемкими или блокирующими операциями. Однако у него есть недостатки, такие как накладные расходы на переключение потоков (переключение контекста) и повышенное потребление памяти.

Напротив, асинхронная обработка снижает затраты на переключение контекста, поскольку не зависит от потоков. Однако если выполняется тяжелая задача, другим задачам, возможно, придется подождать. Таким образом, он подходит для операций ввода-вывода, таких как запросы API.

(Для задач, требующих большого объема вычислений или требующих точного времени, многопроцессорность часто оказывается более эффективной. В отличие от многопоточности, многопроцессорность позволяет одновременно выполнять несколько задач.)

Например, при использовании OpenAI Realtime API для получения звука с микрофона в режиме реального времени и отправки аудиоданных в API вы можете использовать комбинацию многопоточности и асинхронной обработки:

import asyncio
import threading
import queue
import pyaudio
import websockets

# Use a queue to share data between threads
audio_queue = queue.Queue()

# Thread to capture audio using PyAudio
def audio_stream():
    p = pyaudio.PyAudio()
    stream = p.open(format=pyaudio.paInt16,
                    channels=1,
                    rate=44100,
                    input=True,
                    frames_per_buffer=1024)

    print("Start recording...")
    while True:
        data = stream.read(1024)
        audio_queue.put(data)

# Asynchronous function to send audio data via WebSocket
async def send_audio():
    uri = "ws://localhost:8765"
    async with websockets.connect(uri) as websocket:
        while True:
            # Get audio data from the queue
            data = audio_queue.get()
            if data is None:
                break
            await websocket.send(data)
            print("Sent audio data")

# Start the audio capture thread and run the asynchronous task
def main():
    audio_thread = threading.Thread(target=audio_stream)
    audio_thread.start()

    # Run the WebSocket sending task
    asyncio.run(send_audio())

if __name__ == "__main__":
    main()

Процесс захвата звука является блокирующей операцией, поэтому он выполняется в отдельном потоке с использованием потоков. Напротив, отправка аудиоданных, которая включает в себя операции ввода-вывода, такие как взаимодействие с API, выполняется с использованием асинхронной обработки. (Примечание: PyAudio также можно запускать без блокировки с использованием обратных вызовов.)

Заключение

В этой статье мы представили WebSocket и асинхронную обработку.

Мне эти концепции показались особенно запутанными при работе с API OpenAI Realtime, поэтому я собрал это как личное примечание. Если вы обнаружите какие-либо ошибки или оставите отзыв, я буду признателен за ваш вклад.

Спасибо, что дочитали до конца.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/m_sea_bass/using-websocket-with-python-42b7?1. В случае нарушения авторских прав свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3