1

ユーザーにメールが届くたびに呼び出されるメールパーサーperlスクリプトがあります(.qmailを使用)。メールからカレンダーの添付ファイルを抽出し、Directory::Queue モジュールを使用して実装された FIFO キューにファイルの「パス」を配置します。

カレンダーの添付ファイルのパスを読み取り、ローカル システムとリモート CalDAV サーバーで特定のファイル操作を実行する別の perl スクリプトは、こちらで説明されているように、デーモンとして実行されています。したがって、基本的にこのスクリプトは次のようになります。

my $declarations

sub foo {
.
.
}

sub bar {
. 
. 
}

while ($keep_running) {
    for(keep-checking-the-queue-for-new-entries) {

        sub caldav_logic1 {
        .
        .
     }
        sub caldav_logic2 {
        .
        . 
    }
  }
}  

スクリプトをデーモンとして実行するために Proc::Daemon を使用しています。問題は、このプロセスの CPU 使用率がほぼ 100% であることです。より標準的で安全な方法でデーモンを実装するための提案された方法は何ですか? Proc::Daemon の使用について言及されているリンクに記載されているコードとほぼ同じコードを使用しています。

4

3 に答える 3

3

それはあなたの for ループであり、新しいキュー エントリをチェックしていると思います。

ディレクトリのファイル変更を監視する方法はいくつかあります。これらの方法は OS に依存しますが、それらをラップする Perl モジュールがあるかもしれません。忙しいループの代わりにそれを使用してください。スリープ遅延があっても、OS イベントによって起動するタイミングをプログラムに正確に指示できる場合、ループは非効率的です。

File::ChangeNotifyは有望に見えます。

于 2011-01-21T23:00:02.107 に答える
1

おそらく、本当に継続的なポーリングは必要ありません。キューがkeep-checking-the-queue-for-new-entries空の場合でも、CPU を集中的に使用するコードの部分はありますか? これで、プロセッサが常にビジーである理由が説明できます。

sleep 1ループの最上部 (または最下部) にステートメントを配置して、whileキュー チェックの間でプロセッサを休ませてください。それでもプログラムのパフォーマンスがそれほど低下しない場合 (つまり、会社のカレンダーが更新されるまでに 1 秒余分に待つことができる場合) で、CPU 使用率が依然として高い場合は、、、などを試してsleep 2くださいsleep 5

于 2011-01-21T20:41:27.597 に答える
1
cpan Linux::Inotify2

カーネルはいつファイルが変更されたかを認識し、この情報をサブプログラムを実行するプログラムに送信します。ファイルが変更されたときにのみプログラムがサブを実行するため、これはおそらくより良いでしょう。

于 2011-09-12T07:41:52.930 に答える