ВСТУП
Модуль n2o_pi призначений для створення та відстеження контрольованих процесів у всіх додатках, використовуючи будь-які ETS таблиці. Будь-який контрольований процес у N2O створюється за допомогою n2o_pi, в тому числі: кільцеві віртуальні вузли, таймери, авторизація, процеси веб-сторінок, тестові процеси та інші сервіси. Циклічний процес всередині протокольного обробника info/2 створює нові асинхронні процеси proc/2 у випадку трудоємких операцій, тому що обробник протоколу є критичним місцем, і його слід обробляти якомога швидше.
CALLBACK
proc(term(),#pi{}) -> #ok{} | #reply{}.
proc/2 — це колбек, який буде викликано при кожному виклику gen_server'а: handle_call, handle_cast і handle_info, його init та terminate. Колбек повертає #ok як початковий стан процесу (який також є #pi{}), або його відповідь на gen_server:call/2 з новим станом, включеним в #reply.
ПРИКЛАД
Приклад буквальної реалізації таймера N2O, який позначає недійсними відповідні записи в кеш-таблиці, яка використовується для змінних сесії.
Головне призначення n2o_pi — створювати такі процеси з однієї функції proc/2, та відстежувати pid в ETS таблиці, які визначаються під час ініціалізації процесу #pi{}.
Записи (Records)
Кожен процес керується його протоколом, який насправді є сукупністю повідомлень протоколу. Хоча n2o_pi загалом не обмежує повідомлення протоколу, однак він визначає тип стану процесу, запис #pi{}.
По замовчуванню, в N2O кожне поле повідомлення протоколу повинно бути [].
- name — ім'я процесу, ключ у контрольованому ланцюжку.
- module — назва модуля, в якому розміщено proc/2.
- table — назва ETS таблиці, де зберігається кеш pids.
- sup — додаток, в якому буде створено контрольовані процеси.
- state — стан запущеного контрольованого процесу.
API
start(#pi{}) -> {pid(),term()} | #error{}.
Запускає функцію proc/2 всередині контрольованого процесу.
stop(Class,Name) -> #pi{} | #error{}.
Зупиняє спостереження за процесом та вбиває цей процес.
restart(Class,Name) -> {pid(),term()} | #error{} | #pi{}.
Пробує завершити процес. У разу успіху запускає новий, інакше повертає помилку.
send(Class,Name,term()) -> term().
Надсилає повідомлення, отримане з таблиці Class з ключем Name, gen_call на обробку. Повертає відповідь gen_server:call.
pid(Class,Name) -> pid().
Повертає pid, який зберігався під час ініціалізації процесу в таблиці Class з ключем Name.
Цей модуль може бути пов'язаним з: n2o, n2o_proto, n2o_mqtt.