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

كيفية تنفيذ البث من الخادم إلى العميل في gRPC؟

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

How to Implement Server to Client Broadcasting in gRPC?

البث في gRPC: الاتصال من الخادم إلى العميل

عند إنشاء اتصال gRPC، غالبًا ما يكون من الضروري بث الأحداث أو التحديثات من الخادم إلى العملاء المتصلين. لتحقيق ذلك، يمكن استخدام أساليب مختلفة.

تيار الملاحظات

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

الاستقصاء الطويل

الخيار البديل هو تنفيذ نهج الاستقصاء الطويل. يتضمن ذلك قيام العملاء باستقصاء الخادم بشكل مستمر على فترات زمنية منتظمة، والتحقق من وجود تحديثات جديدة. عند تلقي تحديث، سيتلقى العميل ردًا وينتظر فترة الاستقصاء التالية.

مثال للتنفيذ

إليك مثال لكيفية تنفيذ الاستقصاء الطويل باستخدام gRPC:

كود جانب الخادم

import threading

class UpdaterServer:
    def __init__(self):
        self.condition = threading.Condition()
        self.updates = []

    def post_update(self, update):
        with self.condition:
            self.updates.append(updates)
            self.condition.notify_all()

    def GetUpdates(self, req, context):
        with self.condition:
            while self.updates[req.last_received_update   1:] == []:
                self.condition.wait()
            new_updates = self.updates[req.last_received_update   1:]
            return GetUpdatesResponse(
                updates=new_updates,
                update_index=req.last_received_update   len(new_updates),
            )

رمز العميل (موضوع منفصل)

from threading import Event

def handle_updates(updates):
    pass

event = Event()
request = GetUpdatesRequest(last_received_update=-1)

while not event.is_set():
    try:
        stub = UpdaterStub(channel)
        response = stub.GetUpdates(request, timeout=60*10)
        handle_updates(response.updates)
        request.last_received_update = response.update_index
    except grpc.FutureTimeoutError:
        pass
من خلال تنفيذ هذا الأسلوب، يمكن للعملاء المتصلين استرداد التحديثات من الخادم بطريقة مستمرة.

أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3