WebSocket ist ein Protokoll, das eine bidirektionale Echtzeitkommunikation zwischen einem Browser und einem Server ermöglicht. Bei der herkömmlichen HTTP-Kommunikation sendet der Client eine Anfrage und der Server antwortet, um Daten auszutauschen. Im Gegensatz dazu können bei WebSocket sowohl der Client als auch der Server, sobald die erste Verbindung hergestellt ist, gegenseitig Nachrichten senden und empfangen, ohne dass wiederholt neue Verbindungen hergestellt werden müssen.
In letzter Zeit sind interaktive Dienste wie die OpenAI Realtime API und Hume AI häufiger geworden, was zu einem erwarteten Anstieg der Nachfrage nach WebSocket führt. Dieser Artikel stellt die Grundlagen der Verwendung von WebSocket vor und gibt einen Einblick in die damit verbundene asynchrone Verarbeitung.
In Python können Sie WebSocket wie unten gezeigt verwenden:
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())
Die im vorherigen Code verwendeten Async- und Wait-Funktionen repräsentieren die asynchrone Verarbeitung. Die asynchrone Verarbeitung ist besonders effektiv, wenn mehrere Aufgaben gleichzeitig ausgeführt werden.
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())
In Funktionen, die „await“ verwenden, können andere Aufgaben ausgeführt werden, während auf den Abschluss der aktuellen Aufgabe gewartet wird. Dies ermöglicht einen effizienten Wechsel zwischen Aufgaben.
Multithreading übernimmt auch mehrere Aufgaben, es gibt jedoch einen Unterschied in der Art und Weise, wie Threads verwendet werden:
Multithreading ist effektiv, wenn mit CPU-intensiven oder blockierenden Vorgängen gearbeitet wird. Es hat jedoch Nachteile wie Overhead durch Threadwechsel (Kontextwechsel) und erhöhten Speicherverbrauch.
Im Gegensatz dazu reduziert die asynchrone Verarbeitung den Overhead durch den Kontextwechsel, da sie nicht auf Threads angewiesen ist. Wenn jedoch eine schwere Aufgabe ausgeführt wird, müssen möglicherweise andere Aufgaben warten. Daher eignet es sich für IO-gebundene Vorgänge wie API-Anfragen.
(Für Aufgaben, die rechenintensiv sind oder ein präzises Timing erfordern, ist Multiprocessing oft effektiver. Im Gegensatz zu Multithreading ermöglicht Multiprocessing die gleichzeitige Ausführung mehrerer Aufgaben.)
Wenn Sie beispielsweise die OpenAI Realtime API verwenden, um Audio von einem Mikrofon in Echtzeit zu empfangen und die Audiodaten an die API zu senden, können Sie eine Kombination aus Multithreading und asynchroner Verarbeitung verwenden:
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()
Der Audioaufnahmeprozess ist ein blockierender Vorgang und wird daher mithilfe von Threading in einem separaten Thread ausgeführt. Im Gegensatz dazu erfolgt das Senden der Audiodaten, das IO-gebundene Vorgänge wie die Interaktion mit einer API umfasst, mithilfe asynchroner Verarbeitung. (Hinweis: PyAudio kann auch nicht blockierend mithilfe von Rückrufen ausgeführt werden.)
In diesem Artikel haben wir WebSocket und die asynchrone Verarbeitung vorgestellt.
Ich fand diese Konzepte bei der Arbeit mit der OpenAI Realtime API besonders verwirrend, daher habe ich dies als persönliche Anmerkung zusammengestellt. Wenn Sie Fehler finden oder Feedback haben, würde ich mich über Ihren Beitrag freuen.
Vielen Dank fürs Lesen bis zum Ende.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3