3

古い良い alarm() 呼び出しの時代が終わったように見えるので、これらのブロック呼び出しを行うコードを想定して、perl スレッド (その真新しい「スレッド」モジュールを使用) から作成された read() および write() のブロックを中断する方法変えられない?実際の問題は Modbus デバイスとの通信が滞っていることなので、RS-485 地獄に陥らないように簡単なテストケースを作成しました。

use threads;
use IO::Handle;
threads->create(sub {
        $io = IO::Handle->new_from_fd(fileno(STDIN), 'r') or die;
        $br = read $io, $buf, 100;
        warn "read: $br";
});
while(1) {threads->yield()};

ここでは、キーボードで Ctrl-D を押さない限り warn() は実行されません。read() 呼び出しをタイムアウトする簡単な解決策はありますか?

4

1 に答える 1

1

スレッド化 (Perl ではせいぜいサポートが不十分であり、ほとんどが眉をひそめています) ではなく、代わりにイベント モジュールの 1 つを試してみませんか? これが、Perl における並行処理の標準的な解決策です。

于 2012-07-23T16:59:11.393 に答える