WebSocket هو بروتوكول يتيح الاتصال ثنائي الاتجاه في الوقت الفعلي بين المتصفح والخادم. يتضمن اتصال HTTP التقليدي أن يرسل العميل طلبًا ويستجيب الخادم لتبادل البيانات. في المقابل، مع WebSocket، بمجرد إنشاء الاتصال الأولي، يمكن لكل من العميل والخادم إرسال واستقبال الرسائل لبعضهما البعض دون الحاجة إلى إنشاء اتصالات جديدة بشكل متكرر.
في الآونة الأخيرة، أصبحت الخدمات التفاعلية مثل OpenAI Realtime API وHume AI أكثر شيوعًا، مما أدى إلى زيادة متوقعة في الطلب على 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())
يمثل التزامن والانتظار المستخدم في الكود السابق معالجة غير متزامنة. تعتبر المعالجة غير المتزامنة فعالة بشكل خاص عند تنفيذ مهام متعددة في وقت واحد.
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، لذلك قمت بتجميعها كملاحظة شخصية. إذا وجدت أي أخطاء أو كان لديك أي تعليقات، سأكون ممتنًا لمساهمتك.
شكرًا لقرائتكم حتى النهاية.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3