Movatterモバイル変換


[0]ホーム

URL:


fukuoka.ex, profile picture
Uploaded byfukuoka.ex
1,706 views

Elixir入門「第5回:Visualixirで見るマルチプロセス」

Elixirの「プロセス生成」と「プロセス間通信」を説明した後、プロセス可視化ツール「Visualixir」にて、Elixirのプロセスが増殖する様を眺めてみます

Embed presentation

Elixir入門 第5回「Visualixirで見るマルチプロセス」2017/08/21 ver1.0作成
11. Elixirにおけるプロセス2. プロセスの起動3. メッセージ送受信4. 双方向のメッセージ送受信5. Visualixirでプロセスの可視化6. プロセス発生を観測してみる7. マルチコア/クラウド時代のプロセス指向目次
21.Elixirにおけるプロセス
31.ElixirにおけるプロセスOSErlang VMProcessProcessProcessspawnspawnsend/receiveErlang VMProcessOSElixirにおける「プロセス」は、一般的なプロセスというイメージよりは、スレッドに近いイメージです• ElixirにおけるプロセスはOSのプロセスでは無い• OSのプロセスとして起動する「Erlang VM」上で管理される軽量プロセスを指すhttp://elixir-ja.sena-net.works/getting_started/11.htmlsend/receivespawn
42.プロセスの起動
52.プロセスの起動ElixirイメージをDockerで起動します新たなElixirプロジェクトを作成しますプロジェクトをビルドしますlib/pass.exを、お好きなエディタで以下の通り、書き換えますcd pass# iex -S mix> docker run --rm -v /c/piacere/code:/code -i -t trenpixster/elixir /bin/bash# mix new passdefmodule Pass dodef say( message  "こんにちは。" ), do: IO.puts( message )end
62.プロセスの起動ビルドし、通常の関数として実行すると、以下が表示されますこれが、spawnでプロセスを起動し、実行すると、以下のような、関数の実行結果としての表示と、プロセスのIDが表示されますiex> recompile()iex> Pass.sayこんにちは。:okiex> spawn( Pass, :say, [] )こんにちは。#PID<0.1805.0>第1引数:モジュール名第2引数:関数名 ※「:」を付ける第3引数:関数に渡す引数のリスト※参照:第14章 P162
73.メッセージ送受信
83.メッセージ送受信:受信プロセスの起動さきほどは、メッセージ表示するプロセスを起動しましたが、今度は、メッセージを待ち受け、メッセージを受信したら表示するプロセスを起動しますErlang VMconfirm#PID<0. 1768.0>iex#PID<0.209.0>,spawnsend(hello)hellorecieve
93.メッセージ送受信:受信プロセスの起動さきほどは、メッセージ表示するプロセスを起動しましたが、今度は、メッセージを待ち受け、メッセージを受信したら表示するプロセスを起動します受信プロセスを起動しますdefmodule Pass do…def confirm() doreceive do{ true, message } ->IO.puts( "受信メッセージ'#{message}'。" )endIO.puts( "------ confirm() end ------" )end…iex> recompile()iex> pid = spawn( Pass, :confirm, [] )#PID<0.1768.0>※参照:第14章 P163
103.メッセージ送受信:メッセージ送信受信プロセスのプロセスID宛に"hello"のメッセージを送信すると、受け取ったメッセージを表示し、受信プロセスは終了します受信プロセスは、一度受け取ると、プロセス終了するため、再送しても受信しませんiex> send( pid, { true, "hello" } )受信メッセージ'hello'。{true, "hello"}------ confirm() end ------iex> send( pid, { true, "hello" } ){true, "hello"}「受信メッセージ'hello'。」が表示されない※参照:第14章 P163~164
113.メッセージ送受信:受信(再帰)繰り返し受信可能とするには、自身を再帰呼出しますこれで再送しても、毎回メッセージを受信し、表示しますdefmodule Pass do…def hear() doreceive do{ true, message } ->IO.puts( "受信メッセージ'#{message}'。再度メッセージを受け取れます。" )endhear()IO.puts( "------ hear() end ------" )…# iex -S mixiex> pid = spawn( Pass, :hear, [] )#PID<0.496.0>iex> send( pid, { true, "hello" } )受信メッセージ'hello'。再度メッセージを受け取れます。{true, “hello"}iex> send( pid, { true, “world" } )受信メッセージ‘world'。再度メッセージを受け取れます。{true, "world"}※参照:第14章 P164、166
123.メッセージ送受信:受信のパターンマッチング受信プロセスは、第1引数として「true」のみ受け付けるパターンマッチングになっていますtrue以外を送信すると、メッセージの受け取りがされませんiex> pid = spawn( Pass, :hear, [] )#PID<0.387.0>iex> send( pid, { "hoge", "hello" } ){"hoge", "hello"}iex> send( pid, { :ok, "hello" } ){:ok, "hello"}defmodule Pass do…def hear() doreceive do{ true, message } ->IO.puts( "受信メッセージ'#{message}'。" )…受け取ったメッセージが表示されない受け取ったメッセージが表示されない
134.双方向のメッセージ送受信
144.双方向のメッセージ送受信メッセージ受信後に、送信元へメッセージを返却する、双方向のメッセージ送受信を行ってみますErlang VM:hear_after_say#PID<0.240.0>iex#PID<0.209.0>,spawnrecievesend(‘Yo,Yo’)send(これは{#message}の受信に対する返信です)Yo,Yoこれは’Yo,Yo’の受信に対する返信です
154.双方向のメッセージ送受信メッセージ受信後に、送信元へメッセージを返却する、双方向のメッセージ送受信を行ってみますdefmodule Pass do…def hear_after_say() doreceive do{ sender_pid, message } ->IO.puts( "受信メッセージ'#{message}'。返信をご確認ください。" )send( sender_pid, { true, "これは'#{message}'の受信に対する返信です" } )endhear_after_say()IO.puts( "------ hear_after_say() end ------" )end…※参照:第14章 P163
164.双方向のメッセージ送受信:受信後の返信確認受信プロセスにメッセージを送り、受信したメッセージが表示されるところまでは、これまでと同じですが、裏で返信をしています自分宛に返ってきた返信を確認してみましょうiex> recompile()iex> pid = spawn( Pass, :hear_after_say, [] )#PID<0.240.0>iex> send( pid, { self(), "Yo, Yo" } )受信メッセージ'Yo, Yo'。返信をご確認ください。{#PID<0.209.0>, "Yo, Yo"}返信先としての自分のPIDを渡しますiex> receive do { true, message } -> IO.puts message end「Yo, Yo」受信の返信:ok※参照:第14章 P163~164
174.双方向のメッセージ送受信:返信確認②receive~を手入力する代わりに、confirm()を使って、自分宛に返ってきた返信を確認することもできますなお、confirm()は、もし返信が無かった場合、ずっと待ち続けてしまいますiex> send( pid, { self(), "hear to me." } )受信メッセージ'hear to me.'。返信をご確認ください。{#PID<0.209.0>, "hear to me."}iex> Pass.confirm()受信メッセージ'「hear to me.」受信の返信'------ confirm() end ------:okiex> recompile()iex> Pass.confirm… sendしないときは返信も無いため待ち続けてしまう※参照:第14章 P164
184.双方向のメッセージ送受信:返信タイムアウトチェックから5秒間、返信無なら、タイムアウトさせますこれで返信が無くても、待ち続けないようになりますdefmodule Pass do…def confirm() doreceive do{ true, message } ->IO.puts( "受信メッセージ'#{message}'。" )after 5000 ->IO.puts( "Timeout..." )endIO.puts( "------ confirm() end ------" )…iex> recompile()iex> Pass.confirmTimeout...------ confirm() end ------:ok※参照:第14章 P165
195.Visualixirでプロセスの可視化
205. Visualixirでプロセスの可視化Visualixirは、Elixirのプロセスを可視化するツールですhttps://github.com/koudelka/visualixir顕微鏡で見る微生物のような不思議なUIで可視化されます
21githubからリポジトリをcloneして、ビルドした後、Visualixirを動かすPhoenixを起動しますブラウザで「http://localhost:4000/」を表示すると、Visualixirが表示されます5. Visualixirでプロセスの可視化# git clone https://github.com/koudelka/visualixir# mix deps.get && mix compile && npm install npm@2.1.17# elixir --sname visualixir --hidden -S mix phx.server[info] Running Visualixir.Endpoint with Cowboy using http://localhost:4000
226.プロセス発生を観測してみる
236.プロセス発生を観測してみるPassモジュールを繰り返しspawnするrepeat_spawn()にて、Visualixirでプロセスが増殖していく様を観察してみます別コンソールで、repeat_spawn()を以下のように起動し、Visualixir上でプロセスが増える様を見てみましょうiex> spawn( Pass, :repeat_spawn, [ 1 ] )defmodule Pass do…def repeat_spawn( count ) dospawn( Pass, :sample_process, [ 0 ] )Process.sleep( 500 )l_count = count + 1repeat_spawn( l_count )enddef sample_process( count ) doProcess.sleep( 100 )l_count = count + 1sample_process( l_count )endプロセスを生成し続けるため、再帰呼び出し生成されたプロセスは無限ループで生存させ続ける
246.プロセス発生を観測してみるより高速にプロセスを増殖させてみましょう別コンソールで、repeat_spawn_nosleep()を起動すると、アッと言う間にVisualixir上がプロセスで埋め尽くされるのですが、その状態でも、PCはさほど重くなっていないことが驚きですiex> spawn( Pass, :repeat_spawn_nosleep, [ 1 ] )defmodule Pass do…def repeat_spawn_nosleep ( count ) dospawn( Pass, :sample_process, [ 0 ] )l_count = count + 1l_rem = rem( l_count, 10 )if l_rem == 0 do:timer.sleep( 1 )endrepeat_spawn_nosleep( l_count )end1/10msecのsleep
257.マルチコア/クラウド時代のプロセス指向
267.マルチコア/クラウド時代のプロセス指向今回は、Elixirのプロセスについてご説明しました並行分散のベースとなる、プロセスの生成と通信による組み立てが「そこまで難しく無いかも?」と思っていただけたら、この入門としては大成功です今後ますますマルチコアCPU/クラウドでの性能upが求められるのに対し、「いかに並行分散が簡単にスラスラ書けるか?」という点は、アプリ開発において最も重要となるでしょうElixirは、オブジェクトのようにプロセスを気軽に作り、通信も簡単なので、「プロセス指向」のプログラミングにたやすくシフトできますこうした機会をうまく捉え、仕事でも趣味でも、プログラミングライフをエンジョイしてください!
27ご清聴ありがとうございます

Recommended

PPTX
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
PPTX
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
PDF
Circle ci and docker+serverspec
PDF
Drone.io のご紹介
PDF
Free bsd jail入門
PDF
Docker入門
PDF
東京Node学園#3 Domains & Isolates
PDF
JAWS-UG コンテナ支部 Docker入門 10分ハンズオン
PDF
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
PDF
あの日実行したコンテナの名前を僕達はまだ知らない。
PPTX
実は怖くないDevOps
PDF
ICHIGEKI-MT 2015/03/14
PDF
Docker Swarm入門
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
PDF
Run Jenkins in IBM Containers.
PDF
Tezos Hands on 2019-06-15 Exercise (Japanese)
PPTX
Docker 1.12 の衝撃
PDF
Kubernetes をいじって Hardware LoadBalancer で "type LoadBalancer" を実現してみた @Kuberne...
PDF
Tezos hands-on : Tezos exercise
PDF
RancherでMesosクラスタをデプロイしてみる的ななにか
PPTX
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
PDF
Dockerでデプロイ
PDF
Dive into dockerネットワーク
PPT
サーバー実装いろいろ
 
PDF
【dots. IT勉強会】開発環境のDocker化
PDF
Kubernetes Security with DevSecOps
PPTX
Ss systemdのwslディストロを作る kernelvm探検隊online part 3
PDF
Open-FCoE_osc2011tokyofall_20111119
 
PDF
Elixirだ 第3回
PPTX
イベント駆動プログラミングとI/O多重化

More Related Content

PPTX
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
PPTX
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
PDF
Circle ci and docker+serverspec
PDF
Drone.io のご紹介
PDF
Free bsd jail入門
PDF
Docker入門
PDF
東京Node学園#3 Domains & Isolates
PDF
JAWS-UG コンテナ支部 Docker入門 10分ハンズオン
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
Circle ci and docker+serverspec
Drone.io のご紹介
Free bsd jail入門
Docker入門
東京Node学園#3 Domains & Isolates
JAWS-UG コンテナ支部 Docker入門 10分ハンズオン

What's hot

PDF
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
PDF
あの日実行したコンテナの名前を僕達はまだ知らない。
PPTX
実は怖くないDevOps
PDF
ICHIGEKI-MT 2015/03/14
PDF
Docker Swarm入門
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
PDF
Run Jenkins in IBM Containers.
PDF
Tezos Hands on 2019-06-15 Exercise (Japanese)
PPTX
Docker 1.12 の衝撃
PDF
Kubernetes をいじって Hardware LoadBalancer で "type LoadBalancer" を実現してみた @Kuberne...
PDF
Tezos hands-on : Tezos exercise
PDF
RancherでMesosクラスタをデプロイしてみる的ななにか
PPTX
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
PDF
Dockerでデプロイ
PDF
Dive into dockerネットワーク
PPT
サーバー実装いろいろ
 
PDF
【dots. IT勉強会】開発環境のDocker化
PDF
Kubernetes Security with DevSecOps
PPTX
Ss systemdのwslディストロを作る kernelvm探検隊online part 3
PDF
Open-FCoE_osc2011tokyofall_20111119
 
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
あの日実行したコンテナの名前を僕達はまだ知らない。
実は怖くないDevOps
ICHIGEKI-MT 2015/03/14
Docker Swarm入門
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
Run Jenkins in IBM Containers.
Tezos Hands on 2019-06-15 Exercise (Japanese)
Docker 1.12 の衝撃
Kubernetes をいじって Hardware LoadBalancer で "type LoadBalancer" を実現してみた @Kuberne...
Tezos hands-on : Tezos exercise
RancherでMesosクラスタをデプロイしてみる的ななにか
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
Dockerでデプロイ
Dive into dockerネットワーク
サーバー実装いろいろ
 
【dots. IT勉強会】開発環境のDocker化
Kubernetes Security with DevSecOps
Ss systemdのwslディストロを作る kernelvm探検隊online part 3
Open-FCoE_osc2011tokyofall_20111119
 

Similar to Elixir入門「第5回:Visualixirで見るマルチプロセス」

PDF
Elixirだ 第3回
PPTX
イベント駆動プログラミングとI/O多重化
PPTX
Erlangご紹介 websocket編
PDF
Node.js入門
PDF
ゆとり向けErlang入門 (1): メッセージパッシングことはじめ
PDF
Em synchrony について
PDF
GParsの?Actor Model
PPTX
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
PPTX
Beginning java ee 6 13章メッセージ通信up
PPTX
Beginning Java EE 6 勉強会(5) #bje_study
PDF
10080分でPythonからIP Messeneger
PDF
Erlangやってみた
PDF
ニコニコを支える Erlang / Elixir
PDF
Principles of Transaction Processing Second Edition 4章 5~9節
PDF
Groovyで学ぶプロセス代数 #jjug
PPTX
できないことはPortで外注
KEY
Perl 非同期プログラミング
PDF
Error handling in Erlang and Scala
PPTX
Enshu5
PDF
Protocol Buffers 入門
Elixirだ 第3回
イベント駆動プログラミングとI/O多重化
Erlangご紹介 websocket編
Node.js入門
ゆとり向けErlang入門 (1): メッセージパッシングことはじめ
Em synchrony について
GParsの?Actor Model
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
Beginning java ee 6 13章メッセージ通信up
Beginning Java EE 6 勉強会(5) #bje_study
10080分でPythonからIP Messeneger
Erlangやってみた
ニコニコを支える Erlang / Elixir
Principles of Transaction Processing Second Edition 4章 5~9節
Groovyで学ぶプロセス代数 #jjug
できないことはPortで外注
Perl 非同期プログラミング
Error handling in Erlang and Scala
Enshu5
Protocol Buffers 入門

More from fukuoka.ex

PPTX
AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」
PPTX
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
PPTX
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
PPTX
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
PPTX
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
PDF
重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」
PPTX
AI入門「第1回:AIの歴史とTensorFlow」
PPTX
やや関数型を意識した風Elixir/Phoenixご紹介
PPTX
AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」
PPTX
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
PDF
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」
AI入門「第1回:AIの歴史とTensorFlow」
やや関数型を意識した風Elixir/Phoenixご紹介
AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります

Elixir入門「第5回:Visualixirで見るマルチプロセス」


[8]ページ先頭

©2009-2025 Movatter.jp