」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用長輪詢方法在 gRPC 中實作伺服器到客戶端的事件廣播?

如何使用長輪詢方法在 gRPC 中實作伺服器到客戶端的事件廣播?

發佈於2024-11-03
瀏覽:964

How can you implement server-to-client event broadcasting in gRPC using a long-polling approach?

在gRPC 中將事件從伺服器廣播到客戶端

創建涉及連接到伺服器的多個客戶端的應用程式時,通常需要將事件廣播到所有連接的客戶端。在 gRPC 中,有多種方法可以實現此目的。

需要考慮的一個選項是使用長輪詢方法。這涉及讓客戶端定期輪詢伺服器以獲取更新。當事件發生時,伺服器通知所有連接的客戶端,觸發它們的輪詢呼叫以傳回新資訊。

要在 Python 中實現長輪詢方法,請考慮以下程式碼(類似的實作可以在其他語言,如 Go):

# SERVER
class UpdaterServer(UpdaterServicer):
    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:]
            response = GetUpdatesResponse()
            for update in new_updates:
                response.updates.add().CopyFrom(update)
            response.update_index = req.last_received_update   len(new_updates)
            return response

# SEPARATE THREAD IN CLIENT
request = GetUpdatesRequest()
request.last_received_update = -1
while True:
    stub = UpdaterStub(channel)
    try:
        response = stub.GetUpdates(request, timeout=60*10)
        handle_updates(response.updates)
        request.last_received_update = response.update_index
    except grpc.FutureTimeoutError:
        pass

在此範例中:

  • post_update() 方法允許客戶端收到有關事件的通知。
  • 伺服器維護更新清單並通知客戶端當有新的更新可用時。
  • 客戶端定期輪詢伺服器,等待更新。
  • 當事件發生時,伺服器觸發客戶端的輪詢呼叫以傳回更新的資訊。

使用長輪詢方法可確保所有連接的用戶端接收廣播事件,並提供可靠的方式向多方傳達更新。

最新教學 更多>
  • 如何將`std::string`轉換為`LPCSTR`和`LPWSTR`?
    如何將`std::string`轉換為`LPCSTR`和`LPWSTR`?
    將std::string 轉換為LPCSTR 和LPWSTR將std::string 轉換為LPCSTR 或LPWSTR 需要理解這些的本質指標。讓我們澄清一下它們的定義:LPCSTR 與 LPSTR:LPCSTR:指向常數字串的長指針,本質上是 const char*。 LPSTR:指向字串的長指...
    程式設計 發佈於2024-11-09
  • 黃瓜測試:綜合指南
    黃瓜測試:綜合指南
    Cucumber 是一款支持行为驱动开发 (BDD) 的开源测试工具,使团队能够用任何人都能理解的简单语言编写测试。通过弥合开发人员、测试人员和非技术利益相关者之间的差距,Cucumber 确保软件满足功能和业务需求。 在本文中,我们将深入探讨 Cucumber 测试是什么、它的主要功能以及如何在...
    程式設計 發佈於2024-11-09
  • ## Compare() 與 CompareTo():什麼時候應該在 Java 中使用 Each ?
    ## Compare() 與 CompareTo():什麼時候應該在 Java 中使用 Each ?
    闡明compare()和compareTo()之間的區別Java生態系統圍繞操作對象展開,確定它們的相對順序在各種場景中至關重要。本文旨在闡明兩個關鍵方法:compare() 和compareTo() 之間的細微差別,闡明它們在比較對像中的不同作用。 compareTo()compareTo() 位...
    程式設計 發佈於2024-11-09
  • 兩個指針和滑動視窗模式
    兩個指針和滑動視窗模式
    雙指標與滑動視窗模式 模式1:常數視窗(如window = 4或某個整數值) 例如,給定一個(-ve 和 ve)整數數組,找到大小為 k 的連續視窗的最大和. 模式2:(可變視窗大小)具有的最大子數組/子字串範例:sum
    程式設計 發佈於2024-11-09
  • 何時使用 PSR-4 與類別映射自動載入以獲得最佳效能?
    何時使用 PSR-4 與類別映射自動載入以獲得最佳效能?
    PSR-4 與類別映射自動載入:解決效能爭論問題Composer 為類別自動載入提供了多種選項:PSR- 0/ 4 標準或直接類別映射掃描。儘管文件推薦 PSR-4,但使用者認為類別映射提供更快的載入速度。這就提出了一個問題:如果類別映射看起來比 PSR-4 更優秀,為什麼還要使用 PSR-4? P...
    程式設計 發佈於2024-11-09
  • 使用Java Native Access (JNA)呼叫MacOS API
    使用Java Native Access (JNA)呼叫MacOS API
    介紹 這是一個關於如何將 JNA 與 MacOS API 結合使用的簡單範例。我不會解釋這一點,因為我仍在學習,但我將程式碼保持最少,以便更容易理解並了解如何將其用於其他目的的基本概念。 大部分程式碼來自 Intellij-Community(Apache 授權)。 ...
    程式設計 發佈於2024-11-09
  • 了解 JavaScript 中的匯出和匯入
    了解 JavaScript 中的匯出和匯入
    在 JavaScript 中,模組是獨立的程式碼單元,可以使用匯出將資產公開給其他模組,並使用導入使用來自其他模組的資產。這種機制對於在現代 JavaScript 應用程式中建立模組化和可重複使用的程式碼至關重要。 預設導出 一個模組只能有一個預設導出。 要匯出預設資源,請在匯出的實體之前使用 ...
    程式設計 發佈於2024-11-09
  • 如何避免 Go 模板中 HTML 和 JSON 的意外轉義?
    如何避免 Go 模板中 HTML 和 JSON 的意外轉義?
    在Go 模板中轉義HTML 和JSON在Go 模板中,正確處理HTML 和JSON 以防止意外轉義至關重要。考慮以下範本:<some_html> {{ .SomeOtherHTML }} </some_html>如果您希望輸出只是 ,那麼您可能會遇到到< 和& 等特殊字元被轉...
    程式設計 發佈於2024-11-09
  • CORS 可防止哪些錯誤:「Access-Control-Allow-Origin 不允許來源」?
    CORS 可防止哪些錯誤:「Access-Control-Allow-Origin 不允許來源」?
    CORS 防止的錯誤:「Access-Control-Allow-Origin 不允許來源」簡介:跨來源資源共享(CORS) 期間,當用戶端腳本嘗試從與其運行來源不同的來源存取資源。 原因:此錯誤有幾個潛在原因: 同源策略:未經伺服器明確許可, JavaScript 被限制存取其網域之外的資源。此策...
    程式設計 發佈於2024-11-09
  • 為什麼 useState 在嚴格模式下渲染元件兩次?
    為什麼 useState 在嚴格模式下渲染元件兩次?
    理解useState中的雙重渲染在React中,useState鉤子通常用於管理元件狀態。但是,在某些條件下,您可能會注意到使用 useState 呈現的元件對於每次狀態更新都會呈現兩次。這種行為讓許多未啟用嚴格模式的開發人員感到困惑。為什麼會出現這種情況? 嚴格模式的作用與未啟用嚴格模式的假設相反...
    程式設計 發佈於2024-11-09
  • Flex 專案是區塊級還是 Flex 級?深入研究 CSS 佈局
    Flex 專案是區塊級還是 Flex 級?深入研究 CSS 佈局
    Flex 專案令人困惑的本質:區塊級還是 Flex 等級? Flex 專案是否是區塊級的問題一直是CSS 開發者之間的爭論。 CSS 靈活框佈局模組等級 1 規定 Flex 項目位於 Flex 級別,而不是區塊級別。然而,後面的部分顯示彈性項目的顯示值是「塊化」的。這就提出了一個問題:Flex 專案...
    程式設計 發佈於2024-11-09
  • 如何在不使用 Sudo 的情況下在 macOS 上安裝 Python 套件時修復權限錯誤?
    如何在不使用 Sudo 的情況下在 macOS 上安裝 Python 套件時修復權限錯誤?
    排查macOS 上Pip 的權限錯誤嘗試在Mac 上安裝Python 套件時,您可能會遇到與寫入日誌檔案或網站套件相關的權限錯誤目錄。這些錯誤可能會令人沮喪,特別是如果您想在當前使用者帳戶下安裝軟體包而不使用 sudo。 權限錯誤的根本原因預設情況下,Pip 會嘗試在系統中安裝軟體套件-wide P...
    程式設計 發佈於2024-11-09
  • JavaScript 可以使用座標模擬點擊嗎?
    JavaScript 可以使用座標模擬點擊嗎?
    在 JavaScript 中以座標模擬點擊在 Web 開發中,有時需要模擬使用者交互,例如點擊。 JavaScript 提供了一種利用特定座標來實現此目的的方法。 在 JavaScript 中基於 x,y 座標模擬點擊是否可行? 是的,可以使用 JavaScript 中的座標模擬來點擊。但是,重要的...
    程式設計 發佈於2024-11-09
  • 如何在 Go 中自動執行外部命令輸入:繞過「登入」等命令的使用者互動的指南
    如何在 Go 中自動執行外部命令輸入:繞過「登入」等命令的使用者互動的指南
    Go 自動化外部命令輸入在 Go 中,執行外部命令並管理其輸入和輸出是一項常見任務。但是,在處理提示使用者輸入的命令(例如「登入」)時,以程式設計方式自動執行這些輸入可能具有挑戰性。 解決此問題的一種方法是直接寫入命令的標準輸入(stdin) )使用位元組緩衝區。讓我們深入研究提供的解決方案:lo...
    程式設計 發佈於2024-11-09
  • 如何使用並發在 Go 中高效率地讀寫 CSV 檔案?
    如何使用並發在 Go 中高效率地讀寫 CSV 檔案?
    Go 中高效的 CSV 讀寫Go 中高效的 CSV 讀寫package main import ( "encoding/csv" "fmt" "log" "os" "strconv"...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3