Suche senden
Hochladen
Perl 非同期プログラミング
•
30 gefällt mir
•
7,329 views
L
lestrrat
Folgen
Technologie
Melden
Teilen
Melden
Teilen
1 von 99
Empfohlen
Vue.js でタイマーを作る
Vue.js でタイマーを作る
mizdra
PHPの今とこれから2023
PHPの今とこれから2023
Rui Hirokawa
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
負荷分散勉強会
負荷分散勉強会
Yuji Otani
Laravelを用いたゲームサーバーのチューニング
Laravelを用いたゲームサーバーのチューニング
NOW PRODUCTION
Cloud Foundryは何故動くのか
Cloud Foundryは何故動くのか
Kazuto Kusama
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
Takafumi ONAKA
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
Toshiharu Sugiyama
Empfohlen
Vue.js でタイマーを作る
Vue.js でタイマーを作る
mizdra
PHPの今とこれから2023
PHPの今とこれから2023
Rui Hirokawa
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
負荷分散勉強会
負荷分散勉強会
Yuji Otani
Laravelを用いたゲームサーバーのチューニング
Laravelを用いたゲームサーバーのチューニング
NOW PRODUCTION
Cloud Foundryは何故動くのか
Cloud Foundryは何故動くのか
Kazuto Kusama
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
Takafumi ONAKA
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
Toshiharu Sugiyama
ADRという考えを取り入れてみて
ADRという考えを取り入れてみて
infinite_loop
今Serverlessが面白いわけ
今Serverlessが面白いわけ
Yoichi Kawasaki
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
例外設計における大罪
例外設計における大罪
Takuto Wada
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal
Toru Makabe
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
nota-ja
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi
Basic of virtual memory of Linux
Basic of virtual memory of Linux
Tetsuyuki Kobayashi
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
HTTPを理解する
HTTPを理解する
IIJ
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
実践 NestJS
実践 NestJS
Ayumi Goto
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解
都元ダイスケ Miyamoto
【Visual Studio】開発効率を上げる25個の拡張機能
【Visual Studio】開発効率を上げる25個の拡張機能
Shota Baba
Redmineを快適に使うためのおすすめ初期設定
Redmineを快適に使うためのおすすめ初期設定
Go Maeda
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Seiya Mizuno
WebRTCの技術解説 公開版
WebRTCの技術解説 公開版
Contest Ntt-west
Em synchrony について
Em synchrony について
Tomoya Kawanishi
軽量高機能webサーバーnginx
軽量高機能webサーバーnginx
ngi group.
Weitere ähnliche Inhalte
Was ist angesagt?
ADRという考えを取り入れてみて
ADRという考えを取り入れてみて
infinite_loop
今Serverlessが面白いわけ
今Serverlessが面白いわけ
Yoichi Kawasaki
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
例外設計における大罪
例外設計における大罪
Takuto Wada
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal
Toru Makabe
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
nota-ja
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi
Basic of virtual memory of Linux
Basic of virtual memory of Linux
Tetsuyuki Kobayashi
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
HTTPを理解する
HTTPを理解する
IIJ
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
実践 NestJS
実践 NestJS
Ayumi Goto
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解
都元ダイスケ Miyamoto
【Visual Studio】開発効率を上げる25個の拡張機能
【Visual Studio】開発効率を上げる25個の拡張機能
Shota Baba
Redmineを快適に使うためのおすすめ初期設定
Redmineを快適に使うためのおすすめ初期設定
Go Maeda
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Seiya Mizuno
WebRTCの技術解説 公開版
WebRTCの技術解説 公開版
Contest Ntt-west
Was ist angesagt?
(20)
ADRという考えを取り入れてみて
ADRという考えを取り入れてみて
今Serverlessが面白いわけ
今Serverlessが面白いわけ
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
例外設計における大罪
例外設計における大罪
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
Basic of virtual memory of Linux
Basic of virtual memory of Linux
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
HTTPを理解する
HTTPを理解する
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
実践 NestJS
実践 NestJS
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解
【Visual Studio】開発効率を上げる25個の拡張機能
【Visual Studio】開発効率を上げる25個の拡張機能
Redmineを快適に使うためのおすすめ初期設定
Redmineを快適に使うためのおすすめ初期設定
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
WebRTCの技術解説 公開版
WebRTCの技術解説 公開版
Andere mochten auch
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
Andere mochten auch
(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
テーマ「なんでもないようなこと」
テーマ「なんでもないようなこと」
Ähnlich wie 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
Ähnlich wie 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 )
Mehr von 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
Mehr von 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
Kürzlich hochgeladen
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Toru Tamaki
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Hiroshi Tomioka
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Toru Tamaki
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
CRI Japan, Inc.
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
atsushi061452
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
CRI Japan, Inc.
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
Kürzlich hochgeladen
(11)
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
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.
ご静聴ありがとう ございました
Hinweis der Redaktion
\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