English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

OTP Erlang

OTP (Open Telecom Platform) - это аббревиатура. Это операционная система приложений, а также набор библиотек и процессов для создания大规模овых, устойчивых и распределенных приложений. Если вы хотите использовать OTP Напишите свою собственную программу, и вы обнаружите, что поведение OTP является очень полезной ядро-концепцией. Поведение обертывает распространенные шаблоны поведения - можно рассматривать его как приложение фреймворка, параметризированного модулем обратного вызова.

Сильные стороны OTP (Open Telecom Platform) заключаются в его способности к исправлению ошибок, масштабируемости, динамическом обновлении кода и других свойствах, которые могут быть предоставлены самим поведением. Поэтому, первой базовой концепцией является создание компонента сервера, имитирующего базовую среду OTP. Давайте рассмотрим следующий пример.

Онлайн-пример

-module(server). 
-export([start/2, rpc/2]). 
start(Name, Mod) -> 
   register(Name, spawn(fun() -> loop(Name, Mod, Mod:init()) end)). 
rpc(Name, Request) -> 
   Name ! {self(), Request}, 
   receive 
      {Name, Response} -> Response 
   end. 
   
loop(Name, Mod, State) ->
   receive 
      {From, Request} ->
         {Response, State1} = Mod:handle(Request, State), 
         From ! {Name, Response}, 
         loop(Name, Mod, State1) 
   end.

Обратите внимание на以下几点 в отношении указанного выше программы:

  • Используйте функцию register для регистрации процесса в системе.

  • Этот процесс создает циклическую функцию обработки процесса.

Теперь давайте напишем клиентский программ, который будет использовать серверный процесс.

Онлайн-пример

-module(name_server). 
-export([init/0, add/2, whereis/1, handle/2]). 
-import(server1, [rpc/2]). 
add(Name, Place) -> rpc(name_server, {add, Name, Place}). 
whereis(Name) -> rpc(name_server, {whereis, Name}). 
init() -> dict:new().
handle({add, Name, Place}, Dict) -> {ok, dict:store(Name, Place, Dict)}; 
handle({whereis, Name}, Dict) -> {dict:find(Name, Dict), Dict}.

Этот код фактически выполняет две задачи. Он играет роль модуля обратного вызова, вызываемого из кода серверной рамки, и в то же время он содержит интерфейсные процедуры, вызываемые клиентом. В OTP обычно принято объединять две функции в один модуль.

Таким образом, это способ выполнения программы, указанной выше.

ВerlВ этом разделе, в первую очередь, запустите серверную программу, выполнив следующую команду.

server(name_server,name_server)

Вы получите следующий вывод-

Результат вывода

true

Затем, выполните следующую команду

name_server.add(erlang,"w3codebox").

Вы получите следующий вывод-

Результат вывода

Ok

Затем, выполните следующую команду-

name_server.whereis(erlang).

Вы получите следующий вывод-

Результат вывода

{ok,"w3codebox"}