تسبب gen_server المسمى timer_server في عدم إرجاع وظائف وحدة المؤقت
سؤال
لقد قمت بإنشاء مشرف أدى إلى إنشاء ملف gen_server
اتصلت timer_server
.واحدة من مهام هذا timer_serve
r هو إدارة التسجيل والاتصال timer:send_interval
لإرسال رسالة إلى معرف الهوية في فترة زمنية معينة.
ومع ذلك، في بداية gen_server
, ، حيث أتصل timer:send_interval
كنت أحصل على حبس.قالت الوثائق الموقت:تعود الوظائف على الفور، لذلك كان هذا مقلقًا للغاية.
عندما قمت بإعادة تسمية بلدي gen_server
ل record_timer_server
مسح هذه المشكلة.سؤالي ذو شقين إذن:
- لماذا يمكنني إنشاء عملية مسجلة
timer_server
, ، إذا كان هناك بالفعل متىtimer:start()
تم استدعاؤه من خلال بدء تطبيقي؟ - بمجرد البدء، لماذا لا تتسبب هذه الوظيفة في حدوث تطابق سيئ في العثور على الاسم، إذا كانت تتصل بـ my
timer_server
باستخدامsend_interval
وظيفة؟
لا أعتقد أن الكود ضروري ولكن يمكنني التحديث لإضافة البعض إذا طلب ذلك.
المحلول
يمكن إعادة إنشاء هذا ببساطة عن طريق القيام بما يلي والذي يتم تعليقه عند استدعاء المؤقت:send_interval.
1> register(timer_server, self()).
true
2> timer:send_interval(5000, self(), hello).
وبينما يفشل هذا...
1> timer:send_interval(5000, self(), hello).
{ok,{interval,#Ref<0.0.0.32>}}
2> register(timer_server, self()).
** exited: {badarg,[{erlang,register,[timer_server,<0.30.0>]},
لذا، يبدو أن الاستدعاء الأول للمؤقت يحاول بدء عملية تسمى timer_server، ويتوقف الاتصال إذا كنت قد أخذت هذا الاسم أولاً.
أما عن سبب تعليق timer.erl فيقوم بما يلي:
ensure_started() ->
case whereis(timer_server) of
undefined ->
C = {timer_server, {?MODULE, start_link, []}, permanent, 1000,
worker, [?MODULE]}
supervisor:start_child(kernel_safe_sup, C), % kernel_safe_sup
ok;
_ -> ok
end.
والذي يُرجع جيدًا، متبوعًا بـ gen_server:call to timer_server.ثم تتعطل عمليتك في انتظار الرد.