Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update GenServer #15

Merged
merged 4 commits into from Sep 8, 2017
Merged

update GenServer #15

merged 4 commits into from Sep 8, 2017

Conversation

Zabalkanskiy
Copy link
Contributor

No description provided.


# {{ page.title }}

{% include toc.html %}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Эту строку нужно убрать, у нас нет этого меню


{% include toc.html %}

{% include mix-otp-preface.html %}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это тоже нужно убрать


{% include mix-otp-preface.html %}

В [предыдущей главе](/getting-started/mix-otp/agent.html) мы использовали агенты(agents) чтобы представить наши корзины(buckets). В первой главе мы указали имя каждой корзины, поэтому мы можем сделать следующее:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Перед открывающимися скобками должны быть пробелы

OK
```

Поскольку агенты процессы, каждая корзина имеет идентификатор процесса (PID), но не имеет названия. Мы узнали об регистрации имени [в главе Процессы](/getting-started/processes.html) и вы могли бы решить эту проблему с помощью такой регистрации. Например, мы могли бы создать корзину так:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Между "агенты" и "процессы" в начале нужно тире
"о регистрации" вместо "об"

Тем не менее, это ужасная идея! Имена Процессов в Эликсире должны быть атомами, это означает, что мы должны преобразовать имя корзины (часто получаемое из внешнего клиента) в атомы, **мы никогда не
должны преобразовывать ввод пользователя в атомы**. Сборщик мусора не уничтожает атомы.Генерация атомов из пользовательского ввода может привести к исчерпанию Системной памяти!

На практике скорее всего, вы достигнете предела максимального количества атомов для Виртуальной Машины Эрланга и ваша система упадет в любом случае.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"скорее всего" выделяется запятыми с обеих сторон
"и ваша" два пробела, перед "и" нужна запятая


## `call`, `cast` или `info`?

До сих пор мы воспользовались тремя коллбэками: `handle_call/3`, `handle_cast/2` и `handle_info/2`. Вот что мы должны учитывать при
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В конце этой строки перевод каретки лишний
"Вот, что мы должны" нужна запятая


1. `handle_call/3` должен быть использован для синхронных запросов. Он должен быть выбором по умолчанию в ожидании ответа сервера и является полезным механизмом противодавления.

2. `handle_cast/2` должен быть использован для асинхронных запросов, когда ты не заботишься об ответе. Бросок не дает гарантии что сервер получил сообщение и, по этой причине, его следует использовать с осторожностью. Например, функция `create/2`, которую мы определили в этой главе должна использовать `call/2`. Мы использовали `cast/2` для обучающих целей.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"которую мы определили в этой главе должна" запятая перед "должна"


2. `handle_cast/2` должен быть использован для асинхронных запросов, когда ты не заботишься об ответе. Бросок не дает гарантии что сервер получил сообщение и, по этой причине, его следует использовать с осторожностью. Например, функция `create/2`, которую мы определили в этой главе должна использовать `call/2`. Мы использовали `cast/2` для обучающих целей.

3. `handle_info/2` должен использоваться для всех других сообщений, которые сервер может получать и не передаются через `GenServer.call/2` или `GenServer.cast/2`, включая регулярные сообщения `send/2`. Мониторинг cообщений `:DOWN` как раз такой пример.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

":DOWN как" тут тире перед "как", подлежащее и сказуемое - существительные


Ранее мы узнали о связях в [главе Процессы](/getting-started/processes.html). Теперь, с полным завершением реестра, вам может быть интересно: когда мы должны использовать мониторы и когда следует использовать ссылки?

Ссылки двунаправлены. Если вы связываете два процесса и один из них выйдет из строя, другая сторона тоже выйдет из строя (если только это не улавливает флаг trapping exits true). Монитор является однонаправленным: процесс мониторинга будет только получать уведомления о контролируемом. Другими словами: используйте ссылки, когда вы хотите получить связанные сбои, и мониторьте за процессами, когда вы просто хотите получать информацию о сбоях, выходах и т.д.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"два процесса и один из них" запятая перед "и"
"если только это не улавливает флаг trapping exits true" -> "если только не установлен флаг trapping exits true"
"мониторьте за процессами" -> "мониторьте процессы"

ref = Process.monitor(pid)
```

Это плохая идея, так как мы не хотим, чтобы реестр падал при сбое корзины! Мы обычно избегаем непосредственного создания новых процессов, вместо этого мы делегируем эту ответственность супервизорам. Как мы увидим в следующей главе, супервизеры полагаются на ссылки, и это объясняет, почему API-интерфейсы на основе ссылок (`spawn_link`, `start_linkи` т. д.) Настолько распространены в Эликсире и <abbr title="Open Telecom Platform">OTP</abbr>.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Настолько" с маленькой буквы
"ОТП" ранее было русскими, тут "OTP". Думаю, стоит везде использовать один вариант, и в случае кириллицы расшифровку также давать на русском, "открытая телекоммуникационная платформа"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"start_linkи" тут русская "и" затесалась

@sobolevn
Copy link
Collaborator

@rtrv титаническая работа!

@rtrv
Copy link
Member

rtrv commented Aug 28, 2017

@Zabalkanskiy спасибо за перевод, отличная работа, только мелочи поправить. Пожалуйста, отписывайся в #6 когда начинаешь перевод какого-то раздела, чтобы не возникло коллизий

{% include mix-otp-preface.html %}

В [предыдущей главе](/getting-started/mix-otp/agent.html) мы использовали агенты(agents) чтобы представить наши корзины(buckets). В первой главе мы указали имя каждой корзины, поэтому мы можем сделать следующее:
В [предыдущей главе](/getting-started/mix-otp/agent.html) мы использовали агенты (agents) чтобы представить наши корзины (buckets). В первой главе мы указали имя каждой корзины, поэтому мы можем сделать следующее:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вероятно забыл указать в прошлый раз, перед "чтобы" сразу после закрывающейся скобки нужна запятая

@@ -22,7 +18,7 @@ GET shopping milk
OK
```

Поскольку агенты процессы, каждая корзина имеет идентификатор процесса (PID), но не имеет названия. Мы узнали об регистрации имени [в главе Процессы](/getting-started/processes.html) и вы могли бы решить эту проблему с помощью такой регистрации. Например, мы могли бы создать корзину так:
Поскольку - агенты процессы, каждая корзина имеет идентификатор процесса (PID), но не имеет названия. Мы узнали об регистрации имени [в главе Процессы](/getting-started/processes.html) и вы могли бы решить эту проблему с помощью такой регистрации. Например, мы могли бы создать корзину так:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут тире между "агенты" и "процессы"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"об регистрации" -> "о регистрации"


Вместо того, чтобы злоупотреблять регистрацией имени объекта, мы создадим процесс регистрации, который содержит карту(map), которая связывает имя корзины с процессом корзины.
Вместо того, чтобы злоупотреблять регистрацией имени объекта, мы создадим процесс регистрации, который содержит мэп, который связывает имя корзины с процессом корзины.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Обсуждали потом в комментах, что map всё-таки переводим как "словарь", дальше не пишу по этому поводу

@@ -196,7 +191,7 @@ iex> flush()

Обратите внимание, `Process.monitor(pid)` возвращает уникальную ссылку, что позволяет нам мониторить выходящие сообщения процесса. После того, как мы остановили агента, мы можем при помощи `flush/0` посмотреть все консольные сообщения и обратите внимание, что `:DOWN` сообщение прибыло, с точной ссылкой, возвращенной монитором, указывающией, что процесс завершен корзиной с причиной `:normal`.

Давайте переопределим коллбэки сервера, чтобы исправить баг и пройдем тест. Вопервых, мы изменим состояние GenServer используя два словаря: один, будет содержать `name ‐> pid` и другой, содержит `ref ‐> name`. Затем нам нужно мониторить корзины при помощи `handle_cast/2`, а также реализовать функцию коллбэков `handle_info/2` для обработки мониторинга Сообщений. Полное выполнение коллбэков сервера показано ниже:
Давайте переопределим коллбэки сервера, чтобы исправить баг и пройдем тест. Во-первых, мы изменим состояние GenServer используя два словаря: один будет содержать `name ‐> pid` а другой `ref ‐> name`. Затем нам нужно мониторить корзины при помощи `handle_cast/2`, а также реализовать функцию коллбэков `handle_info/2` для обработки мониторинга Сообщений. Полное выполнение коллбэков сервера показано ниже:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"один будет содержать name ‐> pid а другой ref ‐> name" -> "один будет содержать name ‐> pid, а другой - ref ‐> name". Не хватает запятой и тире

@@ -234,20 +229,19 @@ def handle_info(_msg, state) do
end
```

Заметим, что нам удалось значительно изменить реализацию сервера, без изменения каких либо API клиента. Это одно из преимуществ четкого разделения на серверную и клиентскую части.
Заметим, что нам удалось значительно изменить реализацию сервера без изменения каких либо API клиента. Это одно из преимуществ четкого разделения на серверную и клиентскую части.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"каких-либо" через дефис

@rtrv rtrv merged commit 07301d1 into wunsh:master Sep 8, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants