لا يمكن أن تفرخ مشرف إرلانج من القشرة
-
03-10-2019 - |
سؤال
لقد قمت بتنفيذ Gen_Server و Supervisor: test_server
و test_sup
. أريد اختبارهم من الصدفة/CLI. لقد كتبت start_link
وظائف بحيث يتم تسجيل أسمائهم محليا.
لقد وجدت أنه يمكنني تفرخ test_server
من سطر الأوامر على ما يرام ، ولكن ولدت test_sup
لا يسمح لي بالتفاعل مع الخادم على الإطلاق.
على سبيل المثال ، يمكنني أن تفرخ test_server
من خلال التنفيذ:
1> spawn(test_server, start_link, []).
<0.39.0>
2> registered().
[...,test_server,...]
يمكنني التفاعل مع الخادم ، ويبدو كل شيء على ما يرام.
ومع ذلك ، إذا حاولت أن تفعل الشيء نفسه مع test_sup
, ، لا يتم تسجيل أي أسماء/PIDs جديدة في "عملية CLI" (باستخدام registered/0
). لي test_server
يبدو أنه قد تم إنتاجه ، لكن لا يمكنني التفاعل معها (انظر تعليق Lukas Larsson حول SASL لمعرفة سبب هذا الأمر).
أفترض أنني قمت بترميز خطأ في المشرف ، لكن طريقة بدء تشغيل المشرف تعمل بشكل جيد تمامًا:
1> {ok, Pid}= test_sup:start_link([]).
{ok, <0.39.0>}
2> unlink(Pid).
true
3> registered().
[...,test_server,test_sup,...]
لماذا يمكنني أن أفرخ gen_server ولكن ليس المشرف؟
تحديث
يمكن العثور على الرمز الذي أستخدمه في هذا المشنور. أنا استخدم echo_server
و echo_sup
, ، وحدتان بسيطتان للغاية.
بالنظر إلى هذا الرمز ، يعمل هذا:
spawn(echo_server, start_link, []).
وهذا لا:
spawn(echo_sup, start_link, []).
المحلول 2
قدم هذا التفسير من قبل برنارد دوجان على أسئلة إرلانج قائمة البريدية:
لا تموت العمليات المرتبطة تلقائيًا عندما يتم ربط العملية بالخروج من الكود "عادي". لهذا السبب لا يخرج [echo_server] عند خروج عملية التفريخ. فلماذا يموت المشرف؟ يتم تنفيذ الداخلية لوحدة المشرف في الواقع بأنها مجموعة Gen_Server ، ولكن مع مجموعة Process_Flag (Trap_exit ، True). نتيجة ذلك هي أنه عندما تموت العملية الأصل ، يتم استدعاء () () (وهو ما لا يحدث عند تعطيل Trap_exit) ويتوقف المشرف. من المنطقي في سياق المشرف ، حيث أن المشرف يولد من قبل والديه في شجرة الإشراف - إذا لم يموت كلما أغلقت الوالدين ، مهما كان السبب ، سيكون لديك "فروع" من الشجرة.
نصائح أخرى
عندما تحاول معرفة هذه الأشياء ، عادة ما يكون من المفيد للغاية تشغيل SASL.
التطبيق: ابدأ (SASL).
بهذه الطريقة نأمل أن تعرف لماذا ينتهي المشرف.