मैंने एक पर्यवेक्षक बनाया है जिसने gen_server
को timer_server
कहा जाता है। इस टाइमर_सर्वर
r के कार्यों में से एक का एक निश्चित अंतराल पर किसी संदेश को संदेश भेजने के लिए पंजीकरण और कॉल टाइमर: send_interval
को प्रबंधित करना है।
हालांकि, gen_server
के init में, जहां मैं टाइमर: send_interval
को कॉल करता हूं, मुझे लॉकअप मिल रहा था प्रलेखन ने कहा कि टाइमर: फ़ंक्शंस तुरंत वापस आते हैं, इसलिए यह बहुत परेशान था।
जब मैंने अपना gen_server
से record_timer_server
नाम बदल दिया तो यह समस्या साफ़ हो गई। मेरा प्रश्न तब दो गुना है:
- मैं एक पंजीकृत प्रक्रिया क्यों बना सकता हूं
timer_server
, अगर वहां पहले से ही कोई था जबटाइमर: शुरू ()
मेरे आवेदन को शुरू करने के लिए बुलाया गया था? - एक बार शुरू होने पर, यह काम क्यों नहीं बुरे मैचों का नाम खोजेगा, अगर यह मेरे
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
Post a Comment