Elixir(Erlang)の並列処理の威力を確かめるため、「テストサーバに外部からアクセスできないことを確認する」スクリプトを Elixir で書いてみました。 PythonやRubyなどで普通に直列で実行している場合、途中でつまるサイトがあると、タイムアウトまでそこで止まってしまいます。そういうサイトが複数あった場合にはそりゃもう大変です。並列実行することにより、変なサイトがあっても上限は最悪タイムアウトまでで済むため、精神衛生上とても良いです。しかも Elixir ならとっても簡単に書けます。 ソースコード一式は GitHub に置いてあります。 実行ファイルの作成手順 mix でプロジェクトのガワを作成 mix.exs を編集して依存ファイルをダウンロード Elixirのソースコードを書く コンパイル 実行 mix の設定 mix.exs の生成と編集
Elixir/Phoenixで並行処理を使って大量のメッセージに対応するBOTサーバーを構築する方法を調査してみました。ElixirbotPhoenix Facebook Messenger PlatformやLINE BOTが話題になっていますが、下記の記事でも言及されているように、BOTサーバーとして大量メッセージに対応するには「並行処理」がキモになってきます。 大量メッセージが来ても安心なLINE BOTサーバのアーキテクチャ そしてElixirといえばやっぱり「並行処理」なわけです。ということで「BOTサーバーを効率よく開発するにはElixir/Phoenixってとても良い選択なのでは?」という仮定のもと、色々と検証してみました。 並行処理のコード Elixirでプロセスを起動・管理する方法はいくつも用意されていますが、BOTサーバーの要件的に「状態」を管理する必要はありませんし、
Elixir v1.6.5 Task View Source Conveniences for spawning and awaiting tasks. Tasks are processes meant to execute one particular action throughout their lifetime, often with little or no communication with other processes. The most common use case for tasks is to convert sequential code into concurrent code by computing a value asynchronously: task = Task.async(fn -> do_some_work() end) res = do_s
スーパバイザは、他のプロセスを監視するという一つの目的に特化したプロセスです。 子プロセスが失敗した際に自動的に再起動させることによって、耐障害性の高いアプリケーションを作ることを可能にします。 設定 スーパバイザの魔術は Supervisor.start_link/2 関数の中にあります。 スーパーバイザプロセスと子プロセスを開始するのに加えて、子を管理するためにスーパーバイザが使用する戦略を定義することができます。 OTPの並行性レッスンで実装したSimpleQueueを用いて、始めていきましょう。 新しいプロジェクトを mix new simple_queue --sup を使って作成することで、スーパバイザツリーも一緒に作成することができます。 SimpleQueue モジュール用のコードは lib/simple_queue.ex へ、スーパバイザを起動するコードは lib/sim
Elixirの売りの1つは並行性(コンカレンシー)に対応していることです。 Erlang VM (BEAM)のおかげで、並行処理はElixirでは思ったよりも簡単です。 並行性のモデルはアクターに依存しています。アクターとはメッセージパッシングによって他のプロセスと相互通信を行う、制御されたプロセスのことです。 このレッスンではElixirとともに納められている並行モジュールを見ていきます 続く章では並行モジュールを実装しているOTPの振舞を取り扱います。 プロセス Erlang VM (BEAM)内のプロセスは軽量で、全てのCPU間で実行されます。 ネイティブスレッドのように見えますがそれより単純ですし、Elixirアプリケーション内に数千もの並行プロセスを持つことは珍しくありません。 新しいプロセスを作る最も簡単な方法は、匿名/名前付き関数を引数に取る spawn です。 新しいプロセ
Elixir v1.1.1 Task Conveniences for spawning and awaiting for tasks. Tasks are processes meant to execute one particular action throughout their life-cycle, often with little or no communication with other processes. The most common use case for tasks is to compute a value asynchronously: task = Task.async(fn -> do_some_work() end) res = do_some_other_work() res + Task.await(task) Tasks spawned wi
otp.md Elixir ユーザーのための OTP 入門 (Shinjuku.ex #10) 話すこと OTP とは何か 「よくわからないけど使ったほうがいいっぽい」から「なぜ使うのかを意識して使う」になるための導入(になるといいな) 詳細な API とかには触れません だれ? twitter: @mururururu github: @mururu HPC系の研究室の M1 対象 一応以下のような人が対象です。 Elixir でちょっとでも何か書いたことある人 Elixir の「プロセス」がどんなものかを知っている人 Elixir (Erlang) のコードを全く見たことないとつらいかも Elixir アプリケーションの設計 プロセスってどんな単位で作るの? そもそも Elixir の設計って? コード読もう OTP とは何か OTP Design Principles http://
John Bohnさんのブログ記事 Elixir Process Architecture or: How I Learned to Stop Worrying and Love to Crashの翻訳です。 Elixir(とそのベースになっているErlang)のプロセスは生成のためのコストが小さいため「下手にエラー処理するコードを書いてプロセスを維持するよりはさっさとクラッシュさせて、それに続く処理の中で対策して再起動したほうがよい」という思想があります。それを実際に適用してみたという話です。なお説明を簡単にするために多少端折ってるとのこと。 ところでこのタイトルは某古典的スラップスティックSF映画のアレですね… "クラッシュさせちまえ" それは私が聞かされ続けてきたことだ。正直言ってそのセリフの意味するところを理解するまで少々時間が必要だった。その考え方がピーンと来るにはProcess
Elixir has introduced a wonderful first class concept called a Task. It allows you to do some work in a new process and easily collect the result, like so: iex(1)> something = Task.async fn -> ...(1)> 10 + 6 ...(1)> end %Task{pid: #PID<0.44.0>, ref: #Reference<0.0.0.55>} iex(2)> Task.await(something) 16 On first glance, it looks a lot like constructs found in other languages. For example, Scala ha
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く