2016-02-29 3 views
9

मेरे पास एक जीआरपीसी सर्वर है जो दो एसिंक्रोनस सेवाओं ("मास्टर" और "वर्कर") होस्ट करता है, और मैं सर्वर के लिए सुंदर शटडाउन को कार्यान्वित करना चाहता हूं। प्रत्येक सेवा का अपना grpc::CompletionQueue होता है।जीआरपीसी: सी ++ में एसिंक्रोनस सर्वर को बंद करने का अनुशंसित तरीका क्या है?

वहाँ दो Shutdown() तरीकों संगत हो सकती प्रतीत: grpc::CompletionQueue::Shutdown() और grpc::Server::Shutdown(), लेकिन यह प्रलेखन कि कौन सा प्रयोग किया जाना चाहिए से स्पष्ट नहीं है।

एसिंक्रोनस सेवा को बंद करने के लिए एक अच्छा पैटर्न क्या है?

उत्तर

8

टी एल; डॉ: आप दोनों grpc::Server::Shutdown() और grpc::CompletionQueue::Shutdown() सफाई से बंद करने के लिए (प्रत्येक पूरा होने के सेवा में इस्तेमाल कतार के लिए) कॉल करना होगा।

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

  2. यदि आप इसके बजाय server_->Shutdown() पर कॉल करते हैं, तो सभी संलग्न टैग तुरंत पूर्ण होते हैं (ok == false के साथ)। हालांकि, पूरा होने वाली कतार cq_->Next() में अनिश्चित काल तक अवरुद्ध है।

एक साफ बंद में दोनों cq_->Shutdown() (प्रत्येक परिभाषित पूरा होने कतार के लिए) और server_->Shutdown() परिणाम कॉलिंग।

एक चेतावनी: यदि आप grpc::ServerContext::AsyncNotifyWhenDone() का उपयोग कॉल रद्द करने के लिए एक टैग रजिस्टर करने के लिए, इन नहींcq_->Next() द्वारा यदि सर्वर बंद हो जाता है प्रारंभिक अनुरोध है कि कॉल के लिए प्राप्त होता है से पहले लौटा दी जाएगी। यदि आप स्मृति रिसाव से बचना चाहते हैं, तो आपको संबंधित टैग संरचना के मेमोरी प्रबंधन से सावधान रहना होगा।

संबंधित मुद्दे

 संबंधित मुद्दे