2014年05月16日
Perl - 名前付きPipeでメッセージを受け取る時の注意
殆どメモなんですが、Xbeeの制御コードをPerlで書いているせいで、問題が起きましたのでその対応策を書いておきます。
以下のようにPerlで名前付きPipeでメッセージを待つと、 CPUパワーの殆どを吸い取られます 。topコマンドで確認すると、80-90%近くPerlに使われます。
なので、< FIFO > が空の状態の時はCPUバワーが食わないような待ち方をしないといけません。
ちなみに、 Rubyで以下のようなコードを書いても問題ありません。
Ruby側でちゃんとブロックしてくれます。
色々調べましたが、以下のように Selectを使って待ち、一回読み込んだらその都度Closeしないといけないみたいです。
そうしないと、次回からはselectで0byteリードが効いてブロックがかからないみたいです。
ちなみに、以下のようにFile::Tailも試してみましたが、$fifo->readの内部でエラーが発生して使えませんでした。。
以下のようにPerlで名前付きPipeでメッセージを待つと、 CPUパワーの殆どを吸い取られます 。topコマンドで確認すると、80-90%近くPerlに使われます。
open FIFO, $fifoPath or die $!;
while(my $msg=< FIFO >){
}
なので、< FIFO > が空の状態の時はCPUバワーが食わないような待ち方をしないといけません。
ちなみに、 Rubyで以下のようなコードを書いても問題ありません。
Ruby側でちゃんとブロックしてくれます。
fifo=open(@fifoPath,"r+")
loop{
msg=fifo.gets
色々調べましたが、以下のように Selectを使って待ち、一回読み込んだらその都度Closeしないといけないみたいです。
そうしないと、次回からはselectで0byteリードが効いてブロックがかからないみたいです。
while(1){
open FIFO, $fifoPath or die $!;
my $read_bits = '';
vec($read_bits,fileno(FIFO),1) = 1;
select($read_bits, undef, undef, undef);
while(my $msg=< FIFO >){
}
close FIFO;
}
ちなみに、以下のようにFile::Tailも試してみましたが、$fifo->readの内部でエラーが発生して使えませんでした。。
use File::Tail;
$fifo=File::Tail->new($fifoPath);
while (defined($msg=$fifo->read)) {
}
この記事へのコメント