Perl 非同期プログラミング

L
非同期プログラミング
   with Perl

           2010/08/07
   Japan Perl Association 代表理事
         株式会社ライブドア
    牧    大 輔 (@lestrrat)
さっそくですが


 「複数URLに接続して
HTTP GETするコード」
普通の書き方
use strict;
use LWP::UserAgent;

my @urls = qw(
   http://www.livedoor.com/
   http://www.dena.jp/
   http://mixi.jp/
   http://www.gaiax.co.jp/
);

my $ua = LWP::UserAgent->new();
foreach my $url (@urls) {
   my $res = $ua->get( $url );
   ...
}
ポイント
•シンプル!
•命令を順番に処理
•ソケットからの読み込みに時間がか
かると次の処理に進めない
理想
•とりあえず可能な限りのホストに接続
•接続できたらとりあえずHTTPリクエ
スト発行
•読み込み可能なところ(先に返信が来
たところから)読み込む
read
•read(2) は読み込めるデータが到着
するまでブロックする
•一個だけ遅いホストがあると全体が
遅くなる :/
効率よくread
効率よくread

     ソケット1
効率よくread

     ソケット1

     ソケット2
効率よくread

     ソケット1

     ソケット2

     ソケット3
効率よくread

    読める?     ソケット1
  (データ来た?)
             ソケット2

             ソケット3
効率よくread

             ソケット1

    読める?     ソケット2
  (データ来た?)
             ソケット3
効率よくread

             ソケット1

             ソケット2

    読める?     ソケット3
  (データ来た?)
効率よくread

             ソケット1

             ソケット2

    読める?
    来た!      ソケット3
  (データ来た?)
   読み込め!
効率よくread

             ソケット1

             ソケット2

    読める?
  (データ来た?)
効率よくread

    読める?     ソケット1
  (データ来た?)
             ソケット2
効率よくread

    読める?
     来た!     ソケット1
  (データ来た?)
    読み込め!
             ソケット2
効率よくread

    読める?
  (データ来た?)
             ソケット2
効率よくread

    読める?     ソケット2
  (データ来た?)
効率よくread

     来た!
    読める?     ソケット2
    読み込め!
  (データ来た?)
効率よくread

    読める?
  (データ来た?)
効率よくread
イベント駆動
メインループ
(プログラムの進行)
 を他人に任せる
イベントループ




          =
              while ( $still_alive ) {

                  ... 処理 ...

              }
ループから呼ばれる
コールバックを登録する
イベントループ           キュー

                  コールバック   実行!
                  コールバック


                  コールバック


                  コールバック




          このイベントを待っている
イベント発生!
          コールバックがあるか確認
イベント?非同期?
• イベント駆動の仕組みの中でI/O処理→ファイル
ハンドル等を「非同期モード」にする


• イベント駆動のメリットを生かすにはI/O等ブロッ
クする処理が多いときに使う


•よって「非同期プログラミング」と「イベント駆動
プログラミング」は同義で使うことが多い
AnyEvent
なんで?
POE
Danga::Socket
IO::Async
Event
Glib Qt
お互いに
互換性無し
AnyEvent
非同期フレームワークのラッパ
汎用API           これだけ覚えていればOK




              AnyEvent
デフォルト




                   Event




                                  その他
                           Glib
        POE

              EV
standard API++
混ぜることもできる

 例:POE+EV
新規に書くなら
AnyEventでおk
先にお知らせ
名前空間
AnyEvent
   vs
   AE
スタイルの違いだけ
AnyEvent->timer(
    after => $after,
    interval => $interval,
    cb => sub {
        ....
    }
);



AE::timer $after, $interval, sub {
    ...
};
ここではAEを
 使います
基本コンポーネント

•ループ
•ウォッチャー
•コンディション変数
•ガード
ウォッチャー
AnyEventコンポーネント

        IO    コールバック
                       実行!
       タイマー   コールバック




                 「ウォッチャー」
AnyEventを使う =
 ウォッチャーの管理をする
Timer
my $timer;
$timer = AE::timer 0, 1, sub {
    warn “timer invoked”;
    undef $timer;
};
I/O
my $io;
$io = AE::io $fh, $read_or_write, sub {
    .... # $fhから読んだり、$fhに書いたり
    undef $io;
};



          注意:$fhは非同期モードに指定しておく
fh_nonblocking

use AnyEvent::Util qw(fh_nonblocking);

my $fh = get_socket(...);
fh_nonblocking $fh, 1;

my $io;
$io = AE::io $fh, 0, sub { ... };
シグナル
my $sig;
$sig = AE::signal "TERM", sub {
    ...
    undef $sig;
};
子プロセス
my $child;
$child = AE::child $pid, sub {
    ...
    undef $child;
};
待機状態
my $idle;
$idle = AE::idle sub {
    ...
    undef $idle;
};
なにこれ?
my $timer;
$timer = AE::timer 0, 1, sub {
    warn “timer invoked”;
    undef $timer;
};
Perl:
スコープが終わると
メモリが解放される
AnyEvent:
ウォッチャーが解放されると
イベントがキャンセルされる
NG
{
    my $timer = AE::timer 0, 1, sub {
        warn “timer invoked”; # 走らない!
    };
} # ここにたどり着いた時点で $timerが解放




       スコープ終了。リソース解放され
        $timerも解放されてしまう
Good
my $timer;
$timer = AE::timer 0, 1, sub {
    ...           # どこかで $timer を使うコード
    undef $timer; # 明示的に解放しないと消えない
}



    クロージャで使用されているため
    明示的に解放されるまで生き残る
コンディション変数
• いくつかの違う機能が同居してる
• ちょっと混乱しやすい
• が、重要
• 以降 「condvar」と表記
1. 何かを待つ
•現処理の流れを「止める」
•「知らせ」を待つ
•スクリプトレベルでは「ループに制御
を渡す」
#!perl
use strict;
use AnyEvent;

my $cv = AE::cv {
   print "Endn";
};
my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
   $cv->send;
};

$cv->recv;
#!perl
use strict;
use AnyEvent;

my $cv = AE::cv {
   print "Endn";
};
my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
   $cv->send;
};

$cv->recv;


             知らせ が来るまでこの次にはいかない
               (→イベントループが起動)
#!perl
use strict;
use AnyEvent;

my $cv = AE::cv {
   print "Endn";
};
my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
   $cv->send;      タイマーが起動したら 知らせ を送る
};

$cv->recv;
#!perl
use strict;
use AnyEvent;

my $cv = AE::cv {
   print "Endn";
};
my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
   $cv->send;
};

$cv->recv;


        知らせ が来たら次の処理へ
         (→スクリプト終了)
#!perl
use strict;
use AnyEvent;

my $cv = AE::cv {
   print "Endn";
};
my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
   $cv->send;
};

$cv->recv;
#!perl
use strict;
use AnyEvent;

my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
};
#!perl
use strict;
use AnyEvent;

my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
};



            何も「待つ」ことがなかったので
             イベントループも起動しない
#!perl
use strict;
use AnyEvent;

my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
};
2. 複数の知らせを待つ

•フラグをあげる→落とす
•一つでもフラグがあがっていれば待つ
•フラグが全部落ちるとお知らせ
#!perl
use strict;
use AnyEvent;

my @delay = (1, 2, 5, 10);

my $cv = AE::cv { print "All timers are donen" };

foreach my $delay (@delay) {
   my $timer;
   $cv->begin;
   $timer = AE::timer $delay, 0, sub {
      print "Timer for delay = $delayn";
      undef $timer;
      $cv->end;
   };
}

$cv->recv;
#!perl
use strict;
use AnyEvent;

my @delay = (1, 2, 5, 10);

my $cv = AE::cv { print "All timers are donen" };

foreach my $delay (@delay) {
   my $timer;
   $cv->begin;             フラグをあげる
   $timer = AE::timer $delay, 0, sub {
      print "Timer for delay = $delayn";
      undef $timer;
      $cv->end;
   };
}

$cv->recv;
#!perl
use strict;
use AnyEvent;

my @delay = (1, 2, 5, 10);

my $cv = AE::cv { print "All timers are donen" };

foreach my $delay (@delay) {
   my $timer;
   $cv->begin;
   $timer = AE::timer $delay, 0, sub {
      print "Timer for delay = $delayn";
      undef $timer;
      $cv->end;             フラグを落とす
   };
}

$cv->recv;
#!perl
use strict;
use AnyEvent;

my @delay = (1, 2, 5, 10);

my $cv = AE::cv { print "All timers are donen" };

foreach my $delay (@delay) {
   my $timer;
   $cv->begin;
   $timer = AE::timer $delay, 0, sub {
      print "Timer for delay = $delayn";
      undef $timer;
      $cv->end;
   };
}

$cv->recv;        フラグが全部落ちたらお知らせ
#!perl
use strict;
use AnyEvent;

my @delay = (1, 2, 5, 10);

my $cv = AE::cv { print "All timers are donen" };

foreach my $delay (@delay) {
   my $timer;
   $cv->begin;
   $timer = AE::timer $delay, 0, sub {
      print "Timer for delay = $delayn";
      undef $timer;
      $cv->end;
   };
}

$cv->recv;
3. 処理終了時の
     コールバック
•何か戻り値が必要な時処理結果を待つ
•ウォッチャーを作る関数に知らせて欲
しいcondvarを渡す
#!perl
use strict;
use AnyEvent;

sub add {
   my ($x, $y, $cv) = @_;
   my $timer;
   $timer = AE::timer 5, 0, sub {
       $cv->send( $x + $y );
       undef $timer;
   };
}

my $cv = AE::cv {
   my $cv = shift;
   my ($result) = $cv->recv;
   print "Result = $resultn";
};

add( 3, 2, $cv );
$cv->recv;
#!perl
use strict;
use AnyEvent;

sub add {
   my ($x, $y, $cv) = @_;
   my $timer;
   $timer = AE::timer 5, 0, sub {
       $cv->send( $x + $y );
       undef $timer;
   };
}

my $cv = AE::cv {
   my $cv = shift;
   my ($result) = $cv->recv;
   print "Result = $resultn";
};

add( 3, 2, $cv );      結果を受け取るコールバックを渡す
$cv->recv;
#!perl
use strict;
use AnyEvent;

sub add {
   my ($x, $y, $cv) = @_;
   my $timer;
   $timer = AE::timer 5, 0, sub {
       $cv->send( $x + $y );        計算結果をcondvarに渡す
       undef $timer;
   };
}

my $cv = AE::cv {
   my $cv = shift;
   my ($result) = $cv->recv;
   print "Result = $resultn";
};

add( 3, 2, $cv );
$cv->recv;
#!perl
use strict;
use AnyEvent;

sub add {
   my ($x, $y, $cv) = @_;
   my $timer;
   $timer = AE::timer 5, 0, sub {
       $cv->send( $x + $y );
       undef $timer;
   };
}

my $cv = AE::cv {
   my $cv = shift;
   my ($result) = $cv->recv;        結果を受け取る
   print "Result = $resultn";
};

add( 3, 2, $cv );
$cv->recv;
#!perl
use strict;
use AnyEvent;

sub add {
   my ($x, $y, $cv) = @_;
   my $timer;
   $timer = AE::timer 5, 0, sub {
       $cv->send( $x + $y );
       undef $timer;
   };
}

my $cv = AE::cv {
   my $cv = shift;
   my ($result) = $cv->recv;
   print "Result = $resultn";
};

add( 3, 2, $cv );
$cv->recv;
基本はこれだけ
•ウォッチャーとcondvarだけで基本
的に全てまかなえる
•実際にはこれらを使った高レベルライ
ブラリを使う
AnyEventで


 「複数URLに接続して
HTTP GETするコード」
AnyEvent::HTTP
use strict;
use AnyEvent;
use AnyEvent::HTTP;

my @urls = qw(
   http://www.livedoor.com/
   http://www.dena.jp/
   http://mixi.jp/
   http://www.gaiax.co.jp/
);

my $cv = AE::cv {
   print "Fetched all urls!n";
};

my $guard;
foreach my $url (@urls) {
   $cv->begin;
   $guard = http_get $url, sub {
      print "Got $urln";
      undef $guard;
      $cv->end;
   }
}
$cv->recv;
以上!
•万が一どれかが遅くても、他のURL
は先に処理される
ライブラリ
 AnyEvent::Twitter          AnyEvent::Memcached     AnyEvent::FriendFeed::Realtime




AnyEvent::Twitter::Stream   AnyEvent::ReverseHTTP   AnyEvent::HTTP::MXHR



  AnyEvent::CouchDB         AnyEvent::SuperFeedr       AnyEvent::AIO


  AnyEvent::BDB              AnyEvent::DNS            AnyEvent::Beanstalk



   AnyEvent::DBI            AnyEvent::SNMP             AnyEvent::MP


AnyEvent::Gearman           AnyEvent::XMPP          Cache::Memcached::AnyEvent
Twiggy
Plack用非同期HTTPサーバー
1 スレッド!
複数接続高速処理
plackup -s Twiggy ...
ちょっとずつレスポンス
use strict;
use AnyEvent;

sub {
   my $env = shift;
   return sub {
      my $start_response = shift;
      my $writer = $start_response->( [
         200,
         [ "Content-Type" => "text/plain" ]
      ]);

      my $count = 1;
      my $t; $t = AE::timer 2, 2, sub {
         $writer->write( ($count * 2) . "秒たったよ!n");
         if ($count++ == 5) {
            undef $t;
            $writer->close;
         }
      };
   }
}
用途


                非同期サーバー
•接続後切断しない or              •何らかのイベント待っている
•いつ来るかわからないデー             •メッセージキュー、速いか遅
タを待っている                   いかわからないサービス等
プロキシ
•外部サーバーと連携するサービス
  •サーバーの性能を自分でコントロールできな
  い場合など
•某SNSとか某SNSとか
イベントサーバー
•ブラウザゲーム
•複数のクライアントが同時にイベント
を共有する場合など
注意
•「やりたいから」非同期にすると失敗
する
•「必要があるから」使うべき
•非同期コードは難しくなる
非同期にする条件
• リアルタイム性が重要
  • いつ起こるか分からない
  •ポーリングではリクエスト回数が多すぎる
• I/O待ちが多い
  •データを常時送り続けているのは x
  •待ち時間が長いとメリットがある
非同期にしない理由
•コードが複雑になる
•コードが複雑になる
•コードが複雑になる
•コードが複雑になる
•コードが複雑になる
必要な時だけ使う
  =効果絶大
Perl 非同期プログラミング
Questions?
ご静聴ありがとう
 ございました
1 of 99

Recommended

【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方 by
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方kwatch
34K views58 slides
Node-RED v1.3新機能紹介 by
Node-RED v1.3新機能紹介Node-RED v1.3新機能紹介
Node-RED v1.3新機能紹介Hitachi, Ltd. OSS Solution Center.
389 views14 slides
AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう by
AI x WebAR: MediaPipeのハンドトラッキングを使ってみようAI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
AI x WebAR: MediaPipeのハンドトラッキングを使ってみようTakashi Yoshinaga
1.5K views88 slides
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践 by
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践Yoshifumi Kawai
253.7K views53 slides
Multipeer connectivityを使った 動画のリアルタイム端末間共有 by
Multipeer connectivityを使った 動画のリアルタイム端末間共有Multipeer connectivityを使った 動画のリアルタイム端末間共有
Multipeer connectivityを使った 動画のリアルタイム端末間共有Imajin Kawabe
6.5K views52 slides
注目の最新技術「WebRTC」とは? -技術概要と事例紹介- by
注目の最新技術「WebRTC」とは? -技術概要と事例紹介-注目の最新技術「WebRTC」とは? -技術概要と事例紹介-
注目の最新技術「WebRTC」とは? -技術概要と事例紹介-Yusuke Naka
9.5K views74 slides

More Related Content

What's hot

WebRTC/ORTCの最新動向まるわかり! by
WebRTC/ORTCの最新動向まるわかり!WebRTC/ORTCの最新動向まるわかり!
WebRTC/ORTCの最新動向まるわかり!Yusuke Naka
22.1K views90 slides
Odencat開発戦略2019 by
Odencat開発戦略2019Odencat開発戦略2019
Odencat開発戦略2019Daigo Sato
13.3K views112 slides
Indicativo o subjuntivo: expresión de la opinión, duda, negación y valoración by
Indicativo o subjuntivo: expresión de la opinión, duda, negación y valoraciónIndicativo o subjuntivo: expresión de la opinión, duda, negación y valoración
Indicativo o subjuntivo: expresión de la opinión, duda, negación y valoraciónSpanish Online - José Gallego
1.9K views8 slides
【出張ヒストリア2017】 想像と違ってた! VRUI作りのコツ by
【出張ヒストリア2017】 想像と違ってた! VRUI作りのコツ【出張ヒストリア2017】 想像と違ってた! VRUI作りのコツ
【出張ヒストリア2017】 想像と違ってた! VRUI作りのコツhistoria_Inc
9.8K views86 slides
MVVM入門 by
MVVM入門MVVM入門
MVVM入門Kazutoshi Urabe
7.9K views13 slides
【Unity道場】VectorGraphicsで作る エモい表現 by
【Unity道場】VectorGraphicsで作る エモい表現【Unity道場】VectorGraphicsで作る エモい表現
【Unity道場】VectorGraphicsで作る エモい表現Unity Technologies Japan K.K.
12.9K views62 slides

What's hot(20)

WebRTC/ORTCの最新動向まるわかり! by Yusuke Naka
WebRTC/ORTCの最新動向まるわかり!WebRTC/ORTCの最新動向まるわかり!
WebRTC/ORTCの最新動向まるわかり!
Yusuke Naka22.1K views
Odencat開発戦略2019 by Daigo Sato
Odencat開発戦略2019Odencat開発戦略2019
Odencat開発戦略2019
Daigo Sato13.3K views
【出張ヒストリア2017】 想像と違ってた! VRUI作りのコツ by historia_Inc
【出張ヒストリア2017】 想像と違ってた! VRUI作りのコツ【出張ヒストリア2017】 想像と違ってた! VRUI作りのコツ
【出張ヒストリア2017】 想像と違ってた! VRUI作りのコツ
historia_Inc9.8K views
イマドキ!ユースケース別に見るAWS IoT への接続パターン by seiichi arai
イマドキ!ユースケース別に見るAWS IoT への接続パターンイマドキ!ユースケース別に見るAWS IoT への接続パターン
イマドキ!ユースケース別に見るAWS IoT への接続パターン
seiichi arai2.2K views
ディープラーニングとAppiumでテストを自動化 by Nozomi Ito
ディープラーニングとAppiumでテストを自動化ディープラーニングとAppiumでテストを自動化
ディープラーニングとAppiumでテストを自動化
Nozomi Ito1.9K views
Perl ウェブ開発の中世〜CGI と Plack の間〜 by 鉄次 尾形
Perl ウェブ開発の中世〜CGI と Plack の間〜Perl ウェブ開発の中世〜CGI と Plack の間〜
Perl ウェブ開発の中世〜CGI と Plack の間〜
鉄次 尾形8.7K views
オラクルのトラストモデルとブロックチェーン連携 by Shigeichiro Yamasaki
オラクルのトラストモデルとブロックチェーン連携オラクルのトラストモデルとブロックチェーン連携
オラクルのトラストモデルとブロックチェーン連携
いまさら学ぶMVVMパターン by Yuta Matsumura
いまさら学ぶMVVMパターンいまさら学ぶMVVMパターン
いまさら学ぶMVVMパターン
Yuta Matsumura13.2K views
Unity で実装するエイジングテストのお話 by Shota Baba
Unity で実装するエイジングテストのお話Unity で実装するエイジングテストのお話
Unity で実装するエイジングテストのお話
Shota Baba6.9K views
リアルタイムレンダリングでのマテリアル表現 by kurosaurus
リアルタイムレンダリングでのマテリアル表現リアルタイムレンダリングでのマテリアル表現
リアルタイムレンダリングでのマテリアル表現
kurosaurus7.1K views
絵心がなくてもわかる UE4絵作りのコツ by Masahiko Nakamura
絵心がなくてもわかるUE4絵作りのコツ絵心がなくてもわかるUE4絵作りのコツ
絵心がなくてもわかる UE4絵作りのコツ
Masahiko Nakamura13.5K views
Mojoliciousでつくる! Webアプリ入門 by Yusuke Wada
Mojoliciousでつくる! Webアプリ入門Mojoliciousでつくる! Webアプリ入門
Mojoliciousでつくる! Webアプリ入門
Yusuke Wada22.2K views
WebRTCがよく分からないから調べて試してみた by toru tom
WebRTCがよく分からないから調べて試してみたWebRTCがよく分からないから調べて試してみた
WebRTCがよく分からないから調べて試してみた
toru tom860 views
フロントエンドで GraphQLを使った所感 by Chao Li
フロントエンドで GraphQLを使った所感フロントエンドで GraphQLを使った所感
フロントエンドで GraphQLを使った所感
Chao Li2K views
バーチャルライブプラットフォーム「INSPIX」におけるVRM活用事例 by pulse Inc.
バーチャルライブプラットフォーム「INSPIX」におけるVRM活用事例バーチャルライブプラットフォーム「INSPIX」におけるVRM活用事例
バーチャルライブプラットフォーム「INSPIX」におけるVRM活用事例
pulse Inc.1.7K views

Viewers also liked

Em synchrony について by
Em synchrony についてEm synchrony について
Em synchrony についてTomoya Kawanishi
4.1K views21 slides
軽量高機能webサーバーnginx by
軽量高機能webサーバーnginx軽量高機能webサーバーnginx
軽量高機能webサーバーnginxngi group.
2.7K views10 slides
データベース屋がHyperledger Fabricを検証してみた by
データベース屋がHyperledger Fabricを検証してみたデータベース屋がHyperledger Fabricを検証してみた
データベース屋がHyperledger Fabricを検証してみたHyperleger Tokyo Meetup
10.3K views31 slides
Using Dancer by
Using DancerUsing Dancer
Using DancerYoshihiro Sasaki
5.3K views79 slides
これからのPerlプロダクトのかたち(YAPC::Asia 2013) by
これからのPerlプロダクトのかたち(YAPC::Asia 2013)これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)goccy
7.7K views40 slides
理解したつもりになるGit入門 by
理解したつもりになるGit入門理解したつもりになるGit入門
理解したつもりになるGit入門Yoshihiro Sasaki
995 views47 slides

Viewers also liked(20)

軽量高機能webサーバーnginx by ngi group.
軽量高機能webサーバーnginx軽量高機能webサーバーnginx
軽量高機能webサーバーnginx
ngi group.2.7K views
データベース屋がHyperledger Fabricを検証してみた by Hyperleger Tokyo Meetup
データベース屋がHyperledger Fabricを検証してみたデータベース屋がHyperledger Fabricを検証してみた
データベース屋がHyperledger Fabricを検証してみた
これからのPerlプロダクトのかたち(YAPC::Asia 2013) by goccy
これからのPerlプロダクトのかたち(YAPC::Asia 2013)これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
goccy7.7K views
理解したつもりになるGit入門 by Yoshihiro Sasaki
理解したつもりになるGit入門理解したつもりになるGit入門
理解したつもりになるGit入門
Yoshihiro Sasaki995 views
Plack::Request with Encoding by moznion
Plack::Request with EncodingPlack::Request with Encoding
Plack::Request with Encoding
moznion1.5K views
テーマ「最適化」 by technocat
テーマ「最適化」テーマ「最適化」
テーマ「最適化」
technocat918 views
Google trends to_irc by rarere
Google trends to_ircGoogle trends to_irc
Google trends to_irc
rarere883 views
Games::* - Perlで 「ゲーム」しよう #hokkaidopm by 鉄次 尾形
Games::* - Perlで 「ゲーム」しよう #hokkaidopmGames::* - Perlで 「ゲーム」しよう #hokkaidopm
Games::* - Perlで 「ゲーム」しよう #hokkaidopm
鉄次 尾形3K views
Takao.mt 2013 by moznion
Takao.mt 2013Takao.mt 2013
Takao.mt 2013
moznion690 views
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う by moznion
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使うYAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
moznion4.2K views
YAPCレポートの舞台裏 by Masahiro Honma
YAPCレポートの舞台裏YAPCレポートの舞台裏
YAPCレポートの舞台裏
Masahiro Honma1.6K views
PHPカンファレンス北海道_20160416 by Yoshihiro Sasaki
PHPカンファレンス北海道_20160416PHPカンファレンス北海道_20160416
PHPカンファレンス北海道_20160416
Yoshihiro Sasaki1.1K views
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm by Ryosuke IWANAGA
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
Ryosuke IWANAGA1.8K views
テーマ「なんでもないようなこと」 by technocat
テーマ「なんでもないようなこと」テーマ「なんでもないようなこと」
テーマ「なんでもないようなこと」
technocat862 views

Similar to Perl 非同期プログラミング

ATSプログラミングチュートリアル by
ATSプログラミングチュートリアルATSプログラミングチュートリアル
ATSプログラミングチュートリアルKiwamu Okabe
12.6K views28 slides
GMO TECHNOLOGY BOOT CAMP2015(PHP編) by
GMO TECHNOLOGY BOOT CAMP2015(PHP編)GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)Arata Fujimura
1.7K views112 slides
サーバー実装いろいろ by
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろkjwtnb
1.9K views11 slides
Swift 2.0 で変わったところ「後編」 #cswift by
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftTomohiro Kumagai
18.2K views102 slides
Hack/HHVM 入門 by
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門y-uti
8.4K views41 slides
Cinnamon - simple deploy tool by
Cinnamon - simple deploy toolCinnamon - simple deploy tool
Cinnamon - simple deploy toolYuki Shibazaki
3K views47 slides

Similar to Perl 非同期プログラミング(20)

ATSプログラミングチュートリアル by Kiwamu Okabe
ATSプログラミングチュートリアルATSプログラミングチュートリアル
ATSプログラミングチュートリアル
Kiwamu Okabe12.6K views
GMO TECHNOLOGY BOOT CAMP2015(PHP編) by Arata Fujimura
GMO TECHNOLOGY BOOT CAMP2015(PHP編)GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Arata Fujimura1.7K views
サーバー実装いろいろ by kjwtnb
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろ
kjwtnb1.9K views
Swift 2.0 で変わったところ「後編」 #cswift by Tomohiro Kumagai
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
Tomohiro Kumagai18.2K views
Hack/HHVM 入門 by y-uti
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門
y-uti8.4K views
モダンmod_perl入門 #yapcasia by 鉄次 尾形
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
鉄次 尾形8.2K views
詳説ぺちぺち by do_aki
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺち
do_aki2.1K views
Development app-with-elixir by k1complete
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixir
k1complete1K views
Mojoliciousをウェブ制作現場で使ってみてる by jamadam
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
jamadam4.9K views
PHP5.5新機能「ジェネレータ」初心者入門 by kwatch
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
kwatch22.2K views
Itcamp長崎2012 capistrano by kumachang_LL
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
kumachang_LL452 views
EC-CUBE + PHPUnit で 実践テスト駆動開発 by Kentaro Ohkouchi
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
Kentaro Ohkouchi4.5K views
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析 by Masahiro NAKAYAMA
最近つくったrecent_zombies -  Perlで始めるTwitterタイムライン分析最近つくったrecent_zombies -  Perlで始めるTwitterタイムライン分析
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
Masahiro NAKAYAMA2.1K views
Serf / Consul 入門 ~仕事を楽しくしよう~ by Masahito Zembutsu
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~
Masahito Zembutsu19.3K views
Modern PHP Programming @ PFI Seminar by Sotaro Karasawa
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa7.1K views
Local php-100828 2 by Akio Ishida
Local php-100828 2Local php-100828 2
Local php-100828 2
Akio Ishida978 views
知ってるようで意外と知らないPHPの便利関数 by Wataru Terada
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada9.7K views
15分でCakePHPを始める方法(Nseg 2013-11-09 ) by hiro345
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
hiro3454.4K views

More from lestrrat

Future of Tech "Conferences" by
Future of Tech "Conferences"Future of Tech "Conferences"
Future of Tech "Conferences"lestrrat
1.8K views33 slides
ONIの世界 - ONIcon 2019 Winter by
ONIの世界 - ONIcon 2019 WinterONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 Winterlestrrat
35.6K views53 slides
Slicing, Dicing, And Linting OpenAPI by
Slicing, Dicing, And Linting OpenAPISlicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPIlestrrat
4.1K views79 slides
Oxygen Not Includedをやるべき4つの理由 by
Oxygen Not Includedをやるべき4つの理由Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由lestrrat
6.6K views36 slides
Rejectcon 2018 by
Rejectcon 2018Rejectcon 2018
Rejectcon 2018lestrrat
1.5K views74 slides
Builderscon tokyo 2018 speaker dinner by
Builderscon tokyo 2018 speaker dinnerBuilderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinnerlestrrat
310 views28 slides

More from lestrrat(20)

Future of Tech "Conferences" by lestrrat
Future of Tech "Conferences"Future of Tech "Conferences"
Future of Tech "Conferences"
lestrrat1.8K views
ONIの世界 - ONIcon 2019 Winter by lestrrat
ONIの世界 - ONIcon 2019 WinterONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 Winter
lestrrat35.6K views
Slicing, Dicing, And Linting OpenAPI by lestrrat
Slicing, Dicing, And Linting OpenAPISlicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPI
lestrrat4.1K views
Oxygen Not Includedをやるべき4つの理由 by lestrrat
Oxygen Not Includedをやるべき4つの理由Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由
lestrrat6.6K views
Rejectcon 2018 by lestrrat
Rejectcon 2018Rejectcon 2018
Rejectcon 2018
lestrrat1.5K views
Builderscon tokyo 2018 speaker dinner by lestrrat
Builderscon tokyo 2018 speaker dinnerBuilderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinner
lestrrat310 views
GoらしいAPIを求める旅路 (Go Conference 2018 Spring) by lestrrat
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
lestrrat21K views
Google container builderと友だちになるまで by lestrrat
Google container builderと友だちになるまでGoogle container builderと友だちになるまで
Google container builderと友だちになるまで
lestrrat4.1K views
筋肉によるGoコードジェネレーション by lestrrat
筋肉によるGoコードジェネレーション筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーション
lestrrat4.5K views
iosdc 2017 by lestrrat
iosdc 2017iosdc 2017
iosdc 2017
lestrrat1.1K views
シュラスコの食べ方 超入門 by lestrrat
シュラスコの食べ方 超入門シュラスコの食べ方 超入門
シュラスコの食べ方 超入門
lestrrat5.4K views
OSSの敵になるのもいいじゃない by lestrrat
OSSの敵になるのもいいじゃないOSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃない
lestrrat69.4K views
Coding in the context era by lestrrat
Coding in the context eraCoding in the context era
Coding in the context era
lestrrat3.2K views
Kubernetes in 30 minutes (2017/03/10) by lestrrat
Kubernetes in 30 minutes (2017/03/10)Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)
lestrrat29.3K views
Opening: builderscon tokyo 2016 by lestrrat
Opening: builderscon tokyo 2016Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016
lestrrat4.2K views
Kubernetes in 20 minutes - HDE Monthly Technical Session 24 by lestrrat
Kubernetes in 20 minutes - HDE Monthly Technical Session 24Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
lestrrat1.6K views
小規模でもGKE - DevFest Tokyo 2016 by lestrrat
小規模でもGKE - DevFest Tokyo 2016小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016
lestrrat2.5K views
いまさら聞けないselectあれこれ by lestrrat
いまさら聞けないselectあれこれいまさら聞けないselectあれこれ
いまさら聞けないselectあれこれ
lestrrat24.6K views
Don't Use Reflect - Go 1.7 release party 2016 by lestrrat
Don't Use Reflect - Go 1.7 release party 2016Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016
lestrrat2.5K views
How To Think In Go by lestrrat
How To Think In GoHow To Think In Go
How To Think In Go
lestrrat1.6K views

Recently uploaded

光コラボは契約してはいけない by
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけないTakuya Matsunaga
30 views17 slides
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PC Cluster Consortium
29 views36 slides
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 by
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Hitachi, Ltd. OSS Solution Center.
110 views26 slides
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可 by
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可Hitachi, Ltd. OSS Solution Center.
13 views22 slides
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PC Cluster Consortium
68 views12 slides
私のMicrosoft Azure 2023 by
私のMicrosoft Azure 2023私のMicrosoft Azure 2023
私のMicrosoft Azure 2023Ryuji Iwata
5 views36 slides

Recently uploaded(6)

光コラボは契約してはいけない by Takuya Matsunaga
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけない
Takuya Matsunaga30 views
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by PC Cluster Consortium
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by PC Cluster Consortium
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
私のMicrosoft Azure 2023 by Ryuji Iwata
私のMicrosoft Azure 2023私のMicrosoft Azure 2023
私のMicrosoft Azure 2023
Ryuji Iwata5 views

Perl 非同期プログラミング

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n