ホームページ  >  記事  >  バックエンド開発  >  Python で WebSocket を使用する

Python で WebSocket を使用する

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-11 20:16:01638ブラウズ

Using WebSocket with Python

WebSocketとは何ですか?

WebSocket は、ブラウザとサーバー間のリアルタイムの双方向通信を可能にするプロトコルです。従来の HTTP 通信には、クライアントがリクエストを送信し、サーバーがデータ交換に応答することが含まれます。対照的に、WebSocket では、最初の接続が確立されると、クライアントとサーバーの両方が、新しい接続を繰り返し確立することなく、相互にメッセージを送受信できます。

最近、OpenAI Realtime API や Hume AI などの対話型サービスが一般的になり、WebSocket の需要の増加が予想されます。この記事では、WebSocket の基本的な使用方法と、関連する非同期処理について紹介します。

Python で 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())
  1. websockets.connect(uri) を使用して WebSocket サーバーに接続します。
  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 を使用する関数では、現在のタスクの完了を待っている間に他のタスクを実行できます。これにより、タスク間の効率的な切り替えが可能になります。

非同期処理とマルチスレッド

マルチスレッドでも複数のタスクを処理しますが、スレッドの使用方法に違いがあります。

  • マルチスレッドでは、各タスクに独自のスレッドがあり、プログラムは特定のプロセスが完了するのを待ちながらタスク間を切り替えます。
  • 一方、非同期処理は新しいスレッドを作成せず、タスク間を切り替えます。

マルチスレッドは、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。