Skip to content

Commit

Permalink
[JA] Bump up advanced/otp-concurrency to 1.0.3 (elixirschool#1672)
Browse files Browse the repository at this point in the history
* Improve GenServer definition to state that it's single process

* Newline all sentences
  • Loading branch information
Tsuyoshi84 authored and doomspork committed Jan 4, 2019
1 parent 9c544e9 commit a4ec1f0
Showing 1 changed file with 16 additions and 7 deletions.
23 changes: 16 additions & 7 deletions ja/lessons/advanced/otp-concurrency.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
version: 1.0.2
version: 1.0.3
title: OTPの並行性
---

Expand All @@ -11,18 +11,24 @@ title: OTPの並行性

## GenServer

OTP サーバーは一連のコールバックを実装する GenServer の振る舞いをもったモジュールです。最も基本的なレベルでは、 GenServer は更新された状態を伝える反復処理のたびにに1つのリクエストを処理するループです。
OTP サーバーは一連のコールバックを実装する GenServer の振る舞いをもったモジュールです。
最も基本的なレベルでは、 GenServer は単一プロセスであり、更新された状態を伝える反復処理のたびにに1つのメッセージを処理するループを実行します。

GenServer の API を実演するために、値を格納し読みだす基本的なキューを実装します。

GenServer を始めるには、起動し、初期化処理を行う必要があります。ほとんどの場合、プロセスをリンクしたいので `GenServer.start_link/3` を用います。開始したGenServerモジュールに、初期化用の引数と一連の GenServer オプションを渡します。これらの引数は `GenServer.init/1` に渡され、その戻り値を通して、初期状態が設定されます。私たちの例では、引数が初期状態になります:
GenServer を始めるには、起動し、初期化処理を行う必要があります。
ほとんどの場合、プロセスをリンクしたいので `GenServer.start_link/3` を用います。
開始したGenServerモジュールに、初期化用の引数と一連の GenServer オプションを渡します。
これらの引数は `GenServer.init/1` に渡され、その戻り値を通して、初期状態が設定されます。
私たちの例では、引数が初期状態になります:

```elixir
defmodule SimpleQueue do
use GenServer

@doc """
キューを開始し、リンクします。これはヘルパー関数です。
キューを開始し、リンクします。
これはヘルパー関数です。
"""
def start_link(state \\ []) do
GenServer.start_link(__MODULE__, state, name: __MODULE__)
Expand All @@ -37,9 +43,11 @@ end

### 同期関数

GenServer と同期的な方法、つまり関数を呼びその返答を待つという方法でやりとりをする必要がよくあります。同期リクエストを処理するには、 `GenServer.handle_call/3` コールバックを実装する必要があります。これはリクエスト、呼び出し側の PID と、既存の状態を受け取ります。そして返答は `{:reply, response, state}` のタプルを返すことが期待されます。
GenServer と同期的な方法、つまり関数を呼びその返答を待つという方法でやりとりをする必要がよくあります。
同期リクエストを処理するには、 `GenServer.handle_call/3` コールバックを実装する必要があります。これはリクエスト、呼び出し側の PID と、既存の状態を受け取ります。そして返答は `{:reply, response, state}` のタプルを返すことが期待されます。

パターンマッチングを用いて、多くの異なるリクエストや状態へのコールバックを定義することができます。認められている戻り値の一覧は [`GenServer.handle_call/3`](https://hexdocs.pm/elixir/GenServer.html#c:handle_call/3) のドキュメントで見つけることができます。
パターンマッチングを用いて、多くの異なるリクエストや状態へのコールバックを定義することができます。
認められている戻り値の一覧は [`GenServer.handle_call/3`](https://hexdocs.pm/elixir/GenServer.html#c:handle_call/3) のドキュメントで見つけることができます。

同期的なリクエストを実演するために、現在のキューを表示できて、値を取り除くことができる能力を付け加えましょう:

Expand Down Expand Up @@ -91,7 +99,8 @@ iex> SimpleQueue.queue

### 非同期関数

非同期リクエストは `handle_cast/2` コールバックを用いて処理されます。これは `handle_call/3` によく似た働きをしますが、呼び出し側 PID を受け取らず、返答することも期待されていません。
非同期リクエストは `handle_cast/2` コールバックを用いて処理されます。
これは `handle_call/3` によく似た働きをしますが、呼び出し側 PID を受け取らず、返答することも期待されていません。

enqueue(キューに値を入れる)機能を非同期、つまりキューを更新するけれども現在実行中の処理を遮らないように実装します:

Expand Down

0 comments on commit a4ec1f0

Please sign in to comment.