पर कॉल करता है, मुझे पता है कि जेनसेवर प्रक्रिया स्वयं को कॉल करना बहुत असंभव है क्योंकि आप अनिवार्य रूप से डेडलॉक हिट करते हैं। लेकिन, अगर मैं इस तरह की चीज करने का पसंदीदा तरीका हूं तो मैं उत्सुक हूं।जेनसेवर की संरचना करने का उचित तरीका स्वयं को
निम्नलिखित परिदृश्य मानें: मुझे एक कतार मिली है कि मैं चीजों को पॉप कर रहा हूं। यदि कतार खाली है, तो मैं इसे फिर से भरना चाहता हूं। मैं यह इसलिए की तरह की संरचना कर सकते हैं:
def handle_call(:refill_queue, state) do
new_state = put_some_stuff_in_queue(state)
{:reply, new_state}
end
def handle_call(:pop, state) do
if is_empty_queue(state) do
GenServer.call(self, :refill_queue)
end
val,new_state = pop_something(state)
{:reply, val, new_state}
end
बड़ी समस्या यहाँ है कि यह जब हम कतार फिर से भरना करने की कोशिश गतिरोध होगा। एक समाधान है कि मैं पहले उपयोग किए गए cast
अधिक तो यह गतिरोध नहीं है का उपयोग करें। जैसा तो (रीफिल के लिए cast
को call
बदल)
def handle_cast(:refill_queue, state) do
लेकिन इस मामले में, मुझे लगता है, यह काम नहीं करेगा async डाली कतार फिर से भरना करने के बाद से वास्तव में कतार अर्थ भरने से पहले pop
मामले में वापस कर सकती है मैं एक खाली कतार को बंद करने की कोशिश करूंगा।
वैसे भी, मूल प्रश्न यह है: इसे संभालने का सबसे अच्छा तरीका क्या है? मुझे लगता है इस सवाल का जवाब सिर्फ pop
कॉल के अंदर सीधे put_some_stuff_in_queue
कॉल करने के लिए है, लेकिन मैं जाँच करने के लिए चाहता था। दूसरे शब्दों में, ऐसा लगता है ऐसा करना सही handle_call
और handle_cast
के रूप में संभव के रूप में सरल बनाया जाए और मूल रूप से सिर्फ अन्य कार्यों जहां असली काम होता है रैपर। जैसा कि आप सभी संभव मामलों आप बल्कि बारी कॉल handle_call(:bar)
में handle_call(:foo)
की तुलना के साथ सौदा होगा, को कवर करने की जरूरत है फिर, के रूप में कई handle_*
कार्यों पैदा करते हैं।
मैं एक सादा फ़ंक्शन 'refill_queue' कर दूंगा और इसे' handle_call (: pop) 'से कॉल करूँगा, यदि आपको सिंक्रोनस होने की आवश्यकता है। अन्यथा आपके पास इसे एसिंक को संभालने के लिए कई विकल्प हैं (एक और संदेश 'स्वयं' को भेजें, एक और प्रक्रिया हैंडलिंग रिफिलिंग आदि) –
आपको ['GenStage'] (http://elixir-lang.org/blog पर एक नज़र डालना चाहिए)/2016/07/14/घोषणा-जननांग /), ऐसा लगता है जैसे यह उस कार्यक्षमता को प्रदान करता है जिसे आप ढूंढ रहे हैं। – mudasobwa