That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us

節電対応で休日が日・月になった hatyuki です。ということで、明日がおやすみ! 「DB から引っ張ってきた 5,000 件くらいの URL が、全部 HTTP Status Code 200 を返してくるか調べたいんだけど。」 という、なさそうでやっぱない依頼をうけたのでささっと書いてみることに。 ぱっと思いついたのはこんな感じ。 use strict; use warnings; use Furl; use My::Util qw/ db /; use Test::More; my $furl = Furl->new; my $itr = db->search('tables'); while (my $row = $itr->next) { my $res = $furl->head($row->url); is $res->code, 200, $row->url; } don
Coroでスレッドプールを使うにはasync_poolを使えばいいはずなのですが、何も考えずに使うとうまくいかない場合があります。 最初にまとめ 長いのでまずまとめときます。まとめると単純な話で、「async_poolを使う時には、同時にたくさんのスレッドを利用し過ぎないように気をつける」の一点に尽きます。 ベンチマークをとってみる asyncとasync_pool でベンチマークをとってみると、以下のようになります。 my $tasks = 100; Benchmark::cmpthese 1000, { async => sub { my $sem = Coro::Semaphore->new( 1 - $tasks ); for(1 .. $tasks){ async { $sem->up }; } $sem->down; }, async_pool => sub { my $sem
スクレイピング処理をしていると大量のリクエストを発行する事が多いので、サーバの応答待ち時間がもったいないと感じていたのですが、最近巷でよく目にするCoroというモジュールを調べてみた所、非同期処理が割と簡単に書けるという事で試してみました。 以下では複数のURLに対してCoroを使って非同期でリクエストを投げる関数と、一つ一つリクエストを処理していく関数で、申し訳程度ですが比較ベンチマークを取っています。基本的にはasyncブロックの中に書いた処理が非同期になります。この例で注意するのはasyncブロック内のgetを非同期的に動かす為にCoro::LWPをuseしないと駄目だと言う事です。 #!/usr/bin/perl use strict; use warnings; use Perl6::Say; use Benchmark qw(timethese cmpthese); use L
またまた非同期ブームに乗ってお勉強継続中です。 AnyEventとCoro::AnyEventの違い AnyEventとCoro::AnyEventでは、メインループを回すスレッドが違います。 use strict; use warnings; use AnyEvent; use Coro; # use Coro::AnyEvent; my $done = AE::cv; my $t = AE::timer 0, 0, sub { print $Coro::current->{desc}, "\n"; $done->send; }; $done->recv; このまま動かすと出力は「[main::]」で、Coro::AnyEventを有効にすると「[AnyEvent idle process]」となります。 裏でメインループが回る Coro::AnyEventを有効にすると idle 状態
Coro::AnyEventを使うと、継続渡しスタイルを使わずに非同期を書くことができます*1。 ということで、試しにやってみました。 最初にまとめ AnyEventの層を作り、その上にCoroの層を重ねて、フロントエンドからはCoroの層だけ使うとわかりやすいアプリができるんじゃないかなあと思います。 (0) AnyEventのAPIを作る まず、AnyEventでフロントエンドのための材料を作ります。頑張ってコールバックを使って非同期処理を書いて下さい。名前空間はAnyEvent::的な何かにするといいと思います。また、たぶんこの段階ではまだCoro::AnyEventは使わない方が無難です。ピュアAnyEventの方が使い回しが効きますし。 ここでは、AnyEvent::HTTPを題材にします。バックエンドとしてすでにAnyEvent::HTTPは使えるものとします。 (1) Cor
Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at
前回のエントリでは簡単なクローラの作り方を説明した。しかしこのクローラには欠点があり、取得したいURLが何千何万とある場合、一度にhttp_getが走ってしまい、リソースを使い切ったり同じサーバーへのアクセスを待つ間にタイムアウトしたりと都合が悪かった。そこで今回はAnyEventに加えCoroを使うことにより、並列を使ってリソースへの同時アクセス制限を行うクローラの書き方を解説する。 これは前回のエントリの改良版になるので、初めてこれを読む方は当該エントリを先に読んで頂きたい。 まず、前回はAnyEventを使い、condvarとsend-recvを使ってイベントの監視をしていたが、Coroと同時に使う場合これでは都合が悪い。イベントループを回す場合、一般的にAnyEventはrecvを、Coroはjoinを使うが、これらはどちらもイベントループが終わるまでブロックするのでどちらかし
Coroが非同期にルーチンを扱う(コルーチンを扱う)モジュールだということはご存知だと思うが、いまいちピンと来ていない人も多いのではないだろうか。これは、1つにCoroやCoro::Introの例題が悪すぎると思う。例えば、Coro::Introのサンプルスクリプトはこうだ。 use Coro; async { print "async 1\n"; cede; print "async 2\n"; }; print "main 1\n"; cede; print "main 2\n"; cede; このスクリプトは確かに面白い挙動をするが、スレッドを実現してるんだよと言われるとちょっと「?」である。こんなのgoto文でできるじゃんみたいな。そしていきなりセマフォやチャネルの話に飛んでしまい、肝心の「Coroはスレッドが実現できるんだよ」というところが分かりにくい。そこ
ちょっと波に乗り遅れた感じもしていますが,Coroの5.2もリリースされたことだし,今まで勉強してきたことの復習も兼ね, Coro::Introを訳してみる. http://search.cpan.org/~mlehmann/Coro-5.2/Coro/Intro.pod 訳やそもそもの理解が間違っていたら是非コメントとかで教えてくださいm(__)m どうでもいいけどマジでインデントがスペース3つだ...w Coroの紹介 これはCoroとCoroのサブモジュールの重要な機能について紹介するチュートリアルです. まず基本的なコンセプトを紹介し,その後にそれらの簡単な使い方を紹介します. Coroって何? Coroは初期の段階ではコルーチン*1と呼ばれるファーストクラスの継続の特定の要件を実装したシンプルなモジュールとして作られ始めた. これは基本的には,現在の実行ポイントを保ったまま他のポ
CoroでFlickrにアクセスする もうずいぶん前からCoroを使いたくて使いたくてしょうがなかったのだが、やっときたよ。Flickr APIを叩いて、非同期I/OしながらCoroで写真の情報をダウンロードするよ! まず某sukebeさん作のWebService::Simpleを使ってみるよ(本当に使ったコードは違うフレームワーク用にいろいろついてたので、あまり利便性とか考えずに説明用のコードだけ書きだします) package MyFlickrModel; use strict; use WebService::Simple; my $webservice = WebService::Simple->new( \%必要な引数 ); # 写真のIDを渡すとinfo, context, sizes, permsを全部ひっぱってくる sub find_photo { my $class =
はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28
はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28
Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at
Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at
Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く