WebSocket — это протокол, обеспечивающий двунаправленную связь между браузером и сервером в режиме реального времени. Традиционная HTTP-связь предполагает, что клиент отправляет запрос, а сервер отвечает на обмен данными. Напротив, при использовании WebSocket после установления первоначального соединения и клиент, и сервер могут отправлять и получать сообщения друг другу без необходимости неоднократно устанавливать новые соединения.
В последнее время интерактивные сервисы, такие как OpenAI Realtime API и Hume AI, стали более распространенными, что привело к ожидаемому увеличению спроса на WebSocket. В этой статье представлены основы использования WebSocket, а также сведения о соответствующей асинхронной обработке.
В 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())
Символы 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, поэтому я собрал это как личное примечание. Если вы обнаружите какие-либо ошибки или оставите отзыв, я буду признателен за ваш вклад.
Спасибо, что дочитали до конца.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3