2016-09-21 26 views
0

我需要使用gRPC,但在單線程應用程序中(使用額外的套接字通道)。天真地,我正在考慮使用select()並根據哪個文件描述符彈出,調用gRPC來處理消息。我的問題是,有人可以給我一個粗略的(5-10行代碼)大綱骨架,我需要在select()彈出後調用什麼?如何使用select()和gRPC創建服務器?

在同步案例中看到Google的「hello world」示例意味着一個線程池(我不能使用它),並且在異步情況下顯示主循環阻塞 - 這對我不起作用,因爲我需要處理其他套接字操作。

+0

使用'select()'的任何教程都應該顯示它的基本用法。 – Barmar

+0

其實,選擇()是沒有問題的(我知道如何使用它) - 問題是哪些功能我在GRPC打電話給「處理」的文件,該文件描述彈出,並保證GRPC不會阻塞等待獲取更多數據。 – rkrten

+0

這可能是不可能的。許多RPC庫提供的高級方法可能不允許您分離I/O和函數調用步驟。 – Barmar

回答

0

你不能做到這一點,在這一點(和可能是有史以來)。

一個事件循環,包括直接使用select()/ poll()將風格的API的一大弱點,是他們並不缺乏這兩者之間的直接集成的任何自然的方式組合的。

我們可以在理論上爲Linux增加這樣的功能 - 用timerfd導出epoll_fd,如果調用一個完成隊列會很高效,這會變得可讀,但這樣做會對其餘部分施加很大的約束和架構開銷堆棧只是爲了在Linux上支持這個用例。其他地方需要一個後臺線程來管理fd的可讀性。