टी एल; डॉ: आप दोनों grpc::Server::Shutdown()
और grpc::CompletionQueue::Shutdown()
सफाई से बंद करने के लिए (प्रत्येक पूरा होने के सेवा में इस्तेमाल कतार के लिए) कॉल करना होगा।
आप cq_->Shutdown()
कॉल करते हैं, केवल नमूदार प्रभाव है कि Service::AsyncService::RequestFoo()
को आगामी कॉल (इसी Foo
आरपीसी के लिए उत्पन्न विधि) एक दावे से असफल है। संबंधित सी एपीआई विधि (grpc_completion_queue_shutdown()
) के दस्तावेज़ीकरण को पढ़ने से, ऐसा लगता है कि कतार — यानी RequestFoo()
— पर कॉल करके नया काम जोड़ना अवैध है, इसलिए मैंने अपने सेवा रैपर वर्गों (एक म्यूटेक्स द्वारा संरक्षित) में is_shutdown_
सदस्य जोड़ा ताकि cq_->Shutdown()
के बाद कोई एनक्यू प्रयास नहीं किया जाता है। हालांकि, ऐसा करने के बाद, पूर्णता कतार cq_->Next()
में अनिश्चित काल तक ब्लॉक करती है। कोई भी संलग्न टैग पूर्ण नहीं है (त्रुटि या अन्यथा के साथ)।
यदि आप इसके बजाय server_->Shutdown()
पर कॉल करते हैं, तो सभी संलग्न टैग तुरंत पूर्ण होते हैं (ok == false
के साथ)। हालांकि, पूरा होने वाली कतार cq_->Next()
में अनिश्चित काल तक अवरुद्ध है।
एक साफ बंद में दोनों cq_->Shutdown()
(प्रत्येक परिभाषित पूरा होने कतार के लिए) और server_->Shutdown()
परिणाम कॉलिंग।
एक चेतावनी: यदि आप grpc::ServerContext::AsyncNotifyWhenDone()
का उपयोग कॉल रद्द करने के लिए एक टैग रजिस्टर करने के लिए, इन नहींcq_->Next()
द्वारा यदि सर्वर बंद हो जाता है प्रारंभिक अनुरोध है कि कॉल के लिए प्राप्त होता है से पहले लौटा दी जाएगी। यदि आप स्मृति रिसाव से बचना चाहते हैं, तो आपको संबंधित टैग संरचना के मेमोरी प्रबंधन से सावधान रहना होगा।