سؤال

لقد قمت بتنفيذ 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).

بهذه الطريقة نأمل أن تعرف لماذا ينتهي المشرف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top