تسبب gen_server المسمى timer_server في عدم إرجاع وظائف وحدة المؤقت

StackOverflow https://stackoverflow.com/questions/500169

  •  20-08-2019
  •  | 
  •  

سؤال

لقد قمت بإنشاء مشرف أدى إلى إنشاء ملف gen_server اتصلت timer_server.واحدة من مهام هذا timer_server هو إدارة التسجيل والاتصال timer:send_interval لإرسال رسالة إلى معرف الهوية في فترة زمنية معينة.

ومع ذلك، في بداية gen_server, ، حيث أتصل timer:send_interval كنت أحصل على حبس.قالت الوثائق الموقت:تعود الوظائف على الفور، لذلك كان هذا مقلقًا للغاية.

عندما قمت بإعادة تسمية بلدي gen_server ل record_timer_server مسح هذه المشكلة.سؤالي ذو شقين إذن:

  1. لماذا يمكنني إنشاء عملية مسجلة timer_server, ، إذا كان هناك بالفعل متى timer:start() تم استدعاؤه من خلال بدء تطبيقي؟
  2. بمجرد البدء، لماذا لا تتسبب هذه الوظيفة في حدوث تطابق سيئ في العثور على الاسم، إذا كانت تتصل بـ 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.ثم تتعطل عمليتك في انتظار الرد.

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