"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > استخدام WebSocket مع بايثون

استخدام WebSocket مع بايثون

تم النشر بتاريخ 2024-11-08
تصفح:568

Using WebSocket with Python

ما هو ويبسوكيت؟

WebSocket هو بروتوكول يتيح الاتصال ثنائي الاتجاه في الوقت الفعلي بين المتصفح والخادم. يتضمن اتصال HTTP التقليدي أن يرسل العميل طلبًا ويستجيب الخادم لتبادل البيانات. في المقابل، مع WebSocket، بمجرد إنشاء الاتصال الأولي، يمكن لكل من العميل والخادم إرسال واستقبال الرسائل لبعضهما البعض دون الحاجة إلى إنشاء اتصالات جديدة بشكل متكرر.

في الآونة الأخيرة، أصبحت الخدمات التفاعلية مثل OpenAI Realtime API وHume AI أكثر شيوعًا، مما أدى إلى زيادة متوقعة في الطلب على WebSocket. تقدم هذه المقالة أساسيات كيفية استخدام WebSocket، بالإضافة إلى نظرة على المعالجة غير المتزامنة ذات الصلة.

استخدام WebSocket مع بايثون

في بايثون، يمكنك استخدام 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().

معالجة غير متزامنة

يمثل التزامن والانتظار المستخدم في الكود السابق معالجة غير متزامنة. تعتبر المعالجة غير المتزامنة فعالة بشكل خاص عند تنفيذ مهام متعددة في وقت واحد.

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())

في الوظائف التي تستخدم الانتظار، يمكن تشغيل مهام أخرى أثناء انتظار إكمال المهمة الحالية. وهذا يسمح بالتبديل الفعال بين المهام.

المعالجة غير المتزامنة وتعدد مؤشرات الترابط

يتعامل تعدد العمليات أيضًا مع مهام متعددة، ولكن هناك اختلاف في كيفية استخدام سلاسل الرسائل:

  • في تعدد العمليات، يكون لكل مهمة مؤشر ترابط خاص بها، ويقوم البرنامج بالتبديل بين المهام أثناء انتظار اكتمال عمليات معينة.
  • من ناحية أخرى، لا تؤدي المعالجة غير المتزامنة إلى إنشاء سلاسل رسائل جديدة ولكنها تقوم بالتبديل بين المهام.

تعد تقنية Multithreading فعالة عند العمل مع عمليات كثيفة الاستخدام لوحدة المعالجة المركزية (CPU) أو عمليات الحظر. ومع ذلك، فإن لها عيوبًا مثل الحمل الزائد من تبديل الخيط (تبديل السياق) وزيادة استهلاك الذاكرة.

في المقابل، تعمل المعالجة غير المتزامنة على تقليل الحمل الناتج عن تبديل السياق لأنها لا تعتمد على سلاسل العمليات. ومع ذلك، إذا كانت هناك مهمة ثقيلة قيد التشغيل، فقد تضطر المهام الأخرى إلى الانتظار. على هذا النحو، فهو مناسب للعمليات المرتبطة بـ IO مثل طلبات API.

(بالنسبة للمهام التي تتطلب حوسبة مكثفة أو تتطلب توقيتًا دقيقًا، غالبًا ما تكون المعالجة المتعددة أكثر فعالية. وعلى عكس تعدد العمليات، تسمح المعالجة المتعددة بتشغيل مهام متعددة في وقت واحد.)

على سبيل المثال، عند استخدام OpenAI Realtime 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()

تعد عملية التقاط الصوت عملية حظر، لذا يتم تنفيذها في سلسلة منفصلة باستخدام الترابط. في المقابل، يتم إرسال البيانات الصوتية، التي تتضمن عمليات مرتبطة بالإدخال/الإدخال مثل التفاعل مع واجهة برمجة التطبيقات، باستخدام المعالجة غير المتزامنة. (ملاحظة: يمكن أيضًا تشغيل PyAudio بدون حظر باستخدام عمليات الاسترجاعات.)

خاتمة

في هذه المقالة، قدمنا ​​WebSocket والمعالجة غير المتزامنة.

لقد وجدت هذه المفاهيم مربكة بشكل خاص أثناء العمل مع OpenAI Realtime API، لذلك قمت بتجميعها كملاحظة شخصية. إذا وجدت أي أخطاء أو كان لديك أي تعليقات، سأكون ممتنًا لمساهمتك.

شكرًا لقرائتكم حتى النهاية.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/m_sea_bass/using-websocket-with-python-42b7?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3