X秒ごとにタスクを実行するだけのデーモンをValaで作成したいと思います。私はどちらが最善の方法であるか疑問に思いました:
- Thread.usleep()またはPosix.sleep()
- GLib.MainLoop + GLib.Timeout
- 他の?
何もしていないのに、あまり多くのリソースを食べてほしくない。
X秒ごとにタスクを実行するだけのデーモンをValaで作成したいと思います。私はどちらが最善の方法であるか疑問に思いました:
何もしていないのに、あまり多くのリソースを食べてほしくない。
システム コールでスリープ状態に時間を費やしても、パフォーマンスの観点からは大きな違いはありません。とはいえ、次の 2 つの理由から、MainLoop アプローチを使用することはおそらく理にかなっています。
SIGTERM が与えられたときにデーモンが即座に終了できるように、シグナルハンドラをセットアップする必要があります。を介しquit
てバインドしてメイン ループを呼び出すと、スリープが成功したかどうかを確認するよりも、コードが読みやすくなります。SIGTERM
Posix.signal
複雑さを加えることにした場合でも、MainLoop を使用するとより簡単になります。
GLib.Timeout.add_seconds
次の方法を使用できます。
Timeout.add_seconds (5000, () => {
/* Do what you want here */
// Continue this "loop" every 5000 ms
return Source.CONTINUE;
// Or remove it
return Source.REMOVE;
}, Priority.LOW);
注: バックグラウンドで実行され、他のタスクに優先順位を与える必要があるため、タイムアウトは Priority.LOW として設定されます。