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 を使用する関数では、現在のタスクの完了を待っている間に他のタスクを実行できます。これにより、タスク間の効率的な切り替えが可能になります。
マルチスレッドでも複数のタスクを処理しますが、スレッドの使用方法に違いがあります。
マルチスレッドは、CPU を集中的に使用する操作やブロック操作を行う場合に効果的です。ただし、スレッド切り替え (コンテキスト切り替え) によるオーバーヘッドやメモリ消費量の増加などの欠点があります。
対照的に、非同期処理はスレッドに依存しないため、コンテキスト切り替えによるオーバーヘッドが軽減されます。ただし、重いタスクが実行されている場合、他のタスクが待機する必要がある場合があります。そのため、API リクエストのような IO バウンドの操作に適しています。
(計算量が多いタスクや正確なタイミングが必要なタスクの場合、多くの場合、マルチプロセッシングの方が効果的です。マルチスレッドとは異なり、マルチプロセッシングでは複数のタスクを同時に実行できます。)
たとえば、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 との対話などの IO バウンド操作を含むオーディオ データの送信は、非同期処理を使用して行われます。 (注: PyAudio はコールバックを使用してノンブロッキングで実行することもできます。)
この記事では、WebSocket と非同期処理について紹介しました。
OpenAI Realtime API を使用しているときに、これらの概念が特にわかりにくいと感じたので、個人的なメモとしてまとめました。間違いを見つけた場合やフィードバックがある場合は、ご意見をいただければ幸いです。
最後までお読みいただきありがとうございます。
以上がPython で WebSocket を使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。