Enviar pesquisa
Carregar
Perl 非同期プログラミング
•
30 gostaram
•
7,327 visualizações
L
lestrrat
Seguir
Tecnologia
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 99
Recomendados
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
Teppei Sato
Lightning Talks日本上陸
Lightning Talks日本上陸
Kaoru Maeda
ソフトウェアテストの最新動向の学び方
ソフトウェアテストの最新動向の学び方
Keizo Tatsumi
C#とaop
C#とaop
Hiroshi Maekawa
ASP. NET Core 汎用ホスト概要
ASP. NET Core 汎用ホスト概要
TomomitsuKusaba
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
Recomendados
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
Teppei Sato
Lightning Talks日本上陸
Lightning Talks日本上陸
Kaoru Maeda
ソフトウェアテストの最新動向の学び方
ソフトウェアテストの最新動向の学び方
Keizo Tatsumi
C#とaop
C#とaop
Hiroshi Maekawa
ASP. NET Core 汎用ホスト概要
ASP. NET Core 汎用ホスト概要
TomomitsuKusaba
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
虎の穴 開発室
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
Takafumi ONAKA
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
Takuya Sato
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
DeNA
20140507 akamai紹介資料
20140507 akamai紹介資料
Rie Arai
What should you shift left
What should you shift left
Yasuharu Nishi
FastAPIのテンプレートプロジェクトがいい感じだった話
FastAPIのテンプレートプロジェクトがいい感じだった話
NipponAlgorithm
NoOps?よろしいならば戦争だ
NoOps?よろしいならば戦争だ
Toru Makabe
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
Takuto Wada
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
Takayuki Shimizukawa
虎の穴ラボにおけるリモートワークの働き方
虎の穴ラボにおけるリモートワークの働き方
虎の穴 開発室
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
Recruit Lifestyle Co., Ltd.
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
WebSocketのキホン
WebSocketのキホン
You_Kinjoh
Em synchrony について
Em synchrony について
Tomoya Kawanishi
軽量高機能webサーバーnginx
軽量高機能webサーバーnginx
ngi group.
Mais conteúdo relacionado
Mais procurados
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
虎の穴 開発室
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
Takafumi ONAKA
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
Takuya Sato
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
DeNA
20140507 akamai紹介資料
20140507 akamai紹介資料
Rie Arai
What should you shift left
What should you shift left
Yasuharu Nishi
FastAPIのテンプレートプロジェクトがいい感じだった話
FastAPIのテンプレートプロジェクトがいい感じだった話
NipponAlgorithm
NoOps?よろしいならば戦争だ
NoOps?よろしいならば戦争だ
Toru Makabe
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
Takuto Wada
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
Takayuki Shimizukawa
虎の穴ラボにおけるリモートワークの働き方
虎の穴ラボにおけるリモートワークの働き方
虎の穴 開発室
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
Recruit Lifestyle Co., Ltd.
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
WebSocketのキホン
WebSocketのキホン
You_Kinjoh
Mais procurados
(20)
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
20140507 akamai紹介資料
20140507 akamai紹介資料
What should you shift left
What should you shift left
FastAPIのテンプレートプロジェクトがいい感じだった話
FastAPIのテンプレートプロジェクトがいい感じだった話
NoOps?よろしいならば戦争だ
NoOps?よろしいならば戦争だ
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
虎の穴ラボにおけるリモートワークの働き方
虎の穴ラボにおけるリモートワークの働き方
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
WebSocketのキホン
WebSocketのキホン
Destaque
Em synchrony について
Em synchrony について
Tomoya Kawanishi
軽量高機能webサーバーnginx
軽量高機能webサーバーnginx
ngi group.
データベース屋がHyperledger Fabricを検証してみた
データベース屋がHyperledger Fabricを検証してみた
Hyperleger Tokyo Meetup
Using Dancer
Using Dancer
Yoshihiro Sasaki
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
goccy
理解したつもりになるGit入門
理解したつもりになるGit入門
Yoshihiro Sasaki
Plack::Request with Encoding
Plack::Request with Encoding
moznion
Currying in perl
Currying in perl
Masahiro Honma
テーマ「最適化」
テーマ「最適化」
technocat
Google trends to_irc
Google trends to_irc
rarere
Games::* - Perlで 「ゲーム」しよう #hokkaidopm
Games::* - Perlで 「ゲーム」しよう #hokkaidopm
鉄次 尾形
Takao.mt 2013
Takao.mt 2013
moznion
Use Carton
Use Carton
Yoshihiro Sasaki
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
moznion
YAPCレポートの舞台裏
YAPCレポートの舞台裏
Masahiro Honma
Asset Pipeline for Perl
Asset Pipeline for Perl
Yoshihiro Sasaki
PHPカンファレンス北海道_20160416
PHPカンファレンス北海道_20160416
Yoshihiro Sasaki
YAPC::AsiaとHokkaido.pm
YAPC::AsiaとHokkaido.pm
Yoshihiro Sasaki
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
Ryosuke IWANAGA
テーマ「なんでもないようなこと」
テーマ「なんでもないようなこと」
technocat
Destaque
(20)
Em synchrony について
Em synchrony について
軽量高機能webサーバーnginx
軽量高機能webサーバーnginx
データベース屋がHyperledger Fabricを検証してみた
データベース屋がHyperledger Fabricを検証してみた
Using Dancer
Using Dancer
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
理解したつもりになるGit入門
理解したつもりになるGit入門
Plack::Request with Encoding
Plack::Request with Encoding
Currying in perl
Currying in perl
テーマ「最適化」
テーマ「最適化」
Google trends to_irc
Google trends to_irc
Games::* - Perlで 「ゲーム」しよう #hokkaidopm
Games::* - Perlで 「ゲーム」しよう #hokkaidopm
Takao.mt 2013
Takao.mt 2013
Use Carton
Use Carton
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
YAPCレポートの舞台裏
YAPCレポートの舞台裏
Asset Pipeline for Perl
Asset Pipeline for Perl
PHPカンファレンス北海道_20160416
PHPカンファレンス北海道_20160416
YAPC::AsiaとHokkaido.pm
YAPC::AsiaとHokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
テーマ「なんでもないようなこと」
テーマ「なんでもないようなこと」
Semelhante a Perl 非同期プログラミング
ATSプログラミングチュートリアル
ATSプログラミングチュートリアル
Kiwamu Okabe
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Arata Fujimura
サーバー実装いろいろ
サーバー実装いろいろ
kjwtnb
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
Tomohiro Kumagai
Hack/HHVM 入門
Hack/HHVM 入門
y-uti
Cinnamon - simple deploy tool
Cinnamon - simple deploy tool
Yuki Shibazaki
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
鉄次 尾形
詳説ぺちぺち
詳説ぺちぺち
do_aki
Development app-with-elixir
Development app-with-elixir
k1complete
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
jamadam
WCO2012「PHP教室」
WCO2012「PHP教室」
Takuma Morikawa
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
kwatch
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
kumachang_LL
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
Kentaro Ohkouchi
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
Masahiro NAKAYAMA
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~
Masahito Zembutsu
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
Local php-100828 2
Local php-100828 2
Akio Ishida
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
hiro345
Semelhante a Perl 非同期プログラミング
(20)
ATSプログラミングチュートリアル
ATSプログラミングチュートリアル
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
サーバー実装いろいろ
サーバー実装いろいろ
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
Hack/HHVM 入門
Hack/HHVM 入門
Cinnamon - simple deploy tool
Cinnamon - simple deploy tool
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
詳説ぺちぺち
詳説ぺちぺち
Development app-with-elixir
Development app-with-elixir
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
WCO2012「PHP教室」
WCO2012「PHP教室」
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
Local php-100828 2
Local php-100828 2
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
Mais de lestrrat
Future of Tech "Conferences"
Future of Tech "Conferences"
lestrrat
ONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 Winter
lestrrat
Slicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPI
lestrrat
Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由
lestrrat
Rejectcon 2018
Rejectcon 2018
lestrrat
Builderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinner
lestrrat
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
lestrrat
Google container builderと友だちになるまで
Google container builderと友だちになるまで
lestrrat
筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーション
lestrrat
iosdc 2017
iosdc 2017
lestrrat
シュラスコの食べ方 超入門
シュラスコの食べ方 超入門
lestrrat
OSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃない
lestrrat
Coding in the context era
Coding in the context era
lestrrat
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)
lestrrat
Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016
lestrrat
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
lestrrat
小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016
lestrrat
いまさら聞けないselectあれこれ
いまさら聞けないselectあれこれ
lestrrat
Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016
lestrrat
How To Think In Go
How To Think In Go
lestrrat
Mais de lestrrat
(20)
Future of Tech "Conferences"
Future of Tech "Conferences"
ONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 Winter
Slicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPI
Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由
Rejectcon 2018
Rejectcon 2018
Builderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinner
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
Google container builderと友だちになるまで
Google container builderと友だちになるまで
筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーション
iosdc 2017
iosdc 2017
シュラスコの食べ方 超入門
シュラスコの食べ方 超入門
OSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃない
Coding in the context era
Coding in the context era
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)
Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016
いまさら聞けないselectあれこれ
いまさら聞けないselectあれこれ
Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016
How To Think In Go
How To Think In Go
Perl 非同期プログラミング
1.
非同期プログラミング
with Perl 2010/08/07 Japan Perl Association 代表理事 株式会社ライブドア 牧 大 輔 (@lestrrat)
2.
さっそくですが 「複数URLに接続して HTTP GETするコード」
3.
普通の書き方 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 ); ... }
4.
ポイント •シンプル! •命令を順番に処理 •ソケットからの読み込みに時間がか かると次の処理に進めない
5.
理想 •とりあえず可能な限りのホストに接続 •接続できたらとりあえずHTTPリクエ スト発行 •読み込み可能なところ(先に返信が来 たところから)読み込む
6.
read •read(2) は読み込めるデータが到着 するまでブロックする •一個だけ遅いホストがあると全体が 遅くなる :/
7.
効率よくread
8.
効率よくread
ソケット1
9.
効率よくread
ソケット1 ソケット2
10.
効率よくread
ソケット1 ソケット2 ソケット3
11.
効率よくread
読める? ソケット1 (データ来た?) ソケット2 ソケット3
12.
効率よくread
ソケット1 読める? ソケット2 (データ来た?) ソケット3
13.
効率よくread
ソケット1 ソケット2 読める? ソケット3 (データ来た?)
14.
効率よくread
ソケット1 ソケット2 読める? 来た! ソケット3 (データ来た?) 読み込め!
15.
効率よくread
ソケット1 ソケット2 読める? (データ来た?)
16.
効率よくread
読める? ソケット1 (データ来た?) ソケット2
17.
効率よくread
読める? 来た! ソケット1 (データ来た?) 読み込め! ソケット2
18.
効率よくread
読める? (データ来た?) ソケット2
19.
効率よくread
読める? ソケット2 (データ来た?)
20.
効率よくread
来た! 読める? ソケット2 読み込め! (データ来た?)
21.
効率よくread
読める? (データ来た?)
22.
効率よくread
23.
イベント駆動
24.
メインループ (プログラムの進行) を他人に任せる
25.
イベントループ
= while ( $still_alive ) { ... 処理 ... }
26.
ループから呼ばれる コールバックを登録する
27.
イベントループ
キュー コールバック 実行! コールバック コールバック コールバック このイベントを待っている イベント発生! コールバックがあるか確認
28.
イベント?非同期? • イベント駆動の仕組みの中でI/O処理→ファイル ハンドル等を「非同期モード」にする • イベント駆動のメリットを生かすにはI/O等ブロッ クする処理が多いときに使う •よって「非同期プログラミング」と「イベント駆動 プログラミング」は同義で使うことが多い
29.
AnyEvent
30.
なんで?
31.
POE Danga::Socket IO::Async Event Glib Qt
32.
お互いに 互換性無し
33.
AnyEvent 非同期フレームワークのラッパ
34.
汎用API
これだけ覚えていればOK AnyEvent デフォルト Event その他 Glib POE EV
35.
standard API++
36.
混ぜることもできる 例:POE+EV
37.
新規に書くなら AnyEventでおk
38.
先にお知らせ
39.
名前空間
40.
AnyEvent
vs AE
41.
スタイルの違いだけ AnyEvent->timer( after => $after, interval
=> $interval, cb => sub { .... } ); AE::timer $after, $interval, sub { ... };
42.
ここではAEを 使います
43.
基本コンポーネント •ループ •ウォッチャー •コンディション変数 •ガード
44.
ウォッチャー
45.
AnyEventコンポーネント
IO コールバック 実行! タイマー コールバック 「ウォッチャー」
46.
AnyEventを使う = ウォッチャーの管理をする
47.
Timer my $timer; $timer =
AE::timer 0, 1, sub { warn “timer invoked”; undef $timer; };
48.
I/O my $io; $io =
AE::io $fh, $read_or_write, sub { .... # $fhから読んだり、$fhに書いたり undef $io; }; 注意:$fhは非同期モードに指定しておく
49.
fh_nonblocking use AnyEvent::Util qw(fh_nonblocking); my
$fh = get_socket(...); fh_nonblocking $fh, 1; my $io; $io = AE::io $fh, 0, sub { ... };
50.
シグナル my $sig; $sig =
AE::signal "TERM", sub { ... undef $sig; };
51.
子プロセス my $child; $child =
AE::child $pid, sub { ... undef $child; };
52.
待機状態 my $idle; $idle =
AE::idle sub { ... undef $idle; };
53.
なにこれ? my $timer; $timer =
AE::timer 0, 1, sub { warn “timer invoked”; undef $timer; };
54.
Perl: スコープが終わると メモリが解放される
55.
AnyEvent: ウォッチャーが解放されると イベントがキャンセルされる
56.
NG { my $timer =
AE::timer 0, 1, sub { warn “timer invoked”; # 走らない! }; } # ここにたどり着いた時点で $timerが解放 スコープ終了。リソース解放され $timerも解放されてしまう
57.
Good my $timer; $timer =
AE::timer 0, 1, sub { ... # どこかで $timer を使うコード undef $timer; # 明示的に解放しないと消えない } クロージャで使用されているため 明示的に解放されるまで生き残る
58.
コンディション変数 • いくつかの違う機能が同居してる • ちょっと混乱しやすい •
が、重要 • 以降 「condvar」と表記
59.
1. 何かを待つ •現処理の流れを「止める」 •「知らせ」を待つ •スクリプトレベルでは「ループに制御 を渡す」
60.
#!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;
61.
#!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; 知らせ が来るまでこの次にはいかない (→イベントループが起動)
62.
#!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;
63.
#!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; 知らせ が来たら次の処理へ (→スクリプト終了)
64.
#!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;
65.
#!perl use strict; use AnyEvent; my
$timer; $timer = AE::timer 10, 0, sub { print "Waited 10 seconds!n"; undef $timer; };
66.
#!perl use strict; use AnyEvent; my
$timer; $timer = AE::timer 10, 0, sub { print "Waited 10 seconds!n"; undef $timer; }; 何も「待つ」ことがなかったので イベントループも起動しない
67.
#!perl use strict; use AnyEvent; my
$timer; $timer = AE::timer 10, 0, sub { print "Waited 10 seconds!n"; undef $timer; };
68.
2. 複数の知らせを待つ •フラグをあげる→落とす •一つでもフラグがあがっていれば待つ •フラグが全部落ちるとお知らせ
69.
#!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;
70.
#!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;
71.
#!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;
72.
#!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; フラグが全部落ちたらお知らせ
73.
#!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;
74.
3. 処理終了時の
コールバック •何か戻り値が必要な時処理結果を待つ •ウォッチャーを作る関数に知らせて欲 しいcondvarを渡す
75.
#!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;
76.
#!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;
77.
#!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;
78.
#!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;
79.
#!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;
80.
基本はこれだけ •ウォッチャーとcondvarだけで基本 的に全てまかなえる •実際にはこれらを使った高レベルライ ブラリを使う
81.
AnyEventで 「複数URLに接続して HTTP GETするコード」
82.
AnyEvent::HTTP
83.
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;
84.
以上! •万が一どれかが遅くても、他のURL は先に処理される
85.
ライブラリ 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
86.
Twiggy Plack用非同期HTTPサーバー
87.
1 スレッド! 複数接続高速処理
88.
plackup -s Twiggy
...
89.
ちょっとずつレスポンス 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; } }; } }
90.
用途
非同期サーバー •接続後切断しない or •何らかのイベント待っている •いつ来るかわからないデー •メッセージキュー、速いか遅 タを待っている いかわからないサービス等
91.
プロキシ •外部サーバーと連携するサービス •サーバーの性能を自分でコントロールできな
い場合など •某SNSとか某SNSとか
92.
イベントサーバー •ブラウザゲーム •複数のクライアントが同時にイベント を共有する場合など
93.
注意 •「やりたいから」非同期にすると失敗 する •「必要があるから」使うべき •非同期コードは難しくなる
94.
非同期にする条件 • リアルタイム性が重要
• いつ起こるか分からない •ポーリングではリクエスト回数が多すぎる • I/O待ちが多い •データを常時送り続けているのは x •待ち時間が長いとメリットがある
95.
非同期にしない理由 •コードが複雑になる •コードが複雑になる •コードが複雑になる •コードが複雑になる •コードが複雑になる
96.
必要な時だけ使う =効果絶大
97.
98.
Questions?
99.
ご静聴ありがとう ございました
Notas do Editor
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n