erlang - gen_server named timer_server caused timer module functions to not return -


मैंने एक पर्यवेक्षक बनाया है जिसने gen_server को timer_server कहा जाता है। इस टाइमर_सर्वर r के कार्यों में से एक का एक निश्चित अंतराल पर किसी संदेश को संदेश भेजने के लिए पंजीकरण और कॉल टाइमर: send_interval को प्रबंधित करना है।

हालांकि, gen_server के init में, जहां मैं टाइमर: send_interval को कॉल करता हूं, मुझे लॉकअप मिल रहा था प्रलेखन ने कहा कि टाइमर: फ़ंक्शंस तुरंत वापस आते हैं, इसलिए यह बहुत परेशान था।

जब मैंने अपना gen_server से record_timer_server नाम बदल दिया तो यह समस्या साफ़ हो गई। मेरा प्रश्न तब दो गुना है:

  1. मैं एक पंजीकृत प्रक्रिया क्यों बना सकता हूं timer_server , अगर वहां पहले से ही कोई था जब टाइमर: शुरू () मेरे आवेदन को शुरू करने के लिए बुलाया गया था?
  2. एक बार शुरू होने पर, यह काम क्यों नहीं बुरे मैचों का नाम खोजेगा, अगर यह मेरे timer_server में भेजें_इनटावल फ़ंक्शन?

मुझे नहीं लगता कि कोड आवश्यक है, लेकिन मैं अनुरोध पर कुछ जोड़ने के लिए अपडेट कर सकता हूं।

यह केवल निम्न करने से कॉल करने के लिए, कॉल करने के लिए लटकाए जाने के द्वारा ही बनाया जा सकता है: send_interval।

  1 & gt; रजिस्टर (टाइमर_सर्वर, स्व ()) सच 2 & gt; टाइमर: send_interval (5000, स्व (), हैलो)।  

हालांकि यह विफल रहता है ...

  1 & gt; टाइमर: send_interval (5000, स्व (), हैलो)। {ठीक है, {अंतराल, # रेफरी & lt; 0.0.0.32 & gt;}} 2 & gt; रजिस्टर (टाइमर_सर्वर, स्व ()) ** बाहर निकलते हुए: {badarg, [{erlang, register, [timer_server, & lt; 0.30.0 & gt;]},  

ऐसा लगता है कि टाइमर के लिए पहली कॉल शुरू करने की कोशिश करता है प्रक्रिया जिसे टाइमर_सर्वर कहा जाता है, और यदि आपने पहले यह नाम लिया है, तो लटका हुआ है।

इसे टाइमर पर लटका क्यों है:

  सुनिश्चित करें - प्रारंभ () - & gt; मामले के जहां (टाइमर_सर्वर) अपरिभाषित - & gt; C = {timer_server, {? MODULE, start_link, []}, स्थायी, 1000, कार्यकर्ता, [? MODULE] पर्यवेक्षक: start_child (kernel_safe_sup, c),% kernel_safe_sup ठीक है; _ - & gt; ठीक है अंत  

जो ठीक से रिटर्न करता है, उसके बाद एक gen_server: caller timer_server आपकी प्रक्रिया तब प्रतिक्रिया के लिए प्रतीक्षा कर रही है।


Comments