我想在Vala中制作一个守护进程,它只会每X秒执行一次任务。 我想知道这将是最好的方式:Vala中的高效守护进程
- Thread.usleep()或Posix.sleep()
- GLib.MainLoop + GLib.Timeout
- 其他?
我不希望它时,它什么都不做吃太多资源..
我想在Vala中制作一个守护进程,它只会每X秒执行一次任务。 我想知道这将是最好的方式:Vala中的高效守护进程
我不希望它时,它什么都不做吃太多资源..
如果你花时间在系统调用睡觉,有不会是从性能的角度任何明显差异。这就是说,它可能是有意义的使用主循环的方法有两个原因:
你将需要安装信号处理程序,这样,当它被赋予SIGTERM您的守护进程可以瞬间死亡。如果您通过Posix.signal
绑定SIGTERM
来在主循环中调用quit
,那么这可能会比检查睡眠是否成功更具可读性。
如果您决定增加复杂性,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。
出于好奇:如果cron无法处理它,这是什么样的任务? – Ancurio
更换壁纸..我知道那里有很多壁纸更换器,但我想自己做一个,并想知道如何最好的方式。 – spinatelli
嗯,我认为没有太大区别。无论如何,每个解决方案都可能会在某个时间或某个地方调用系统sleep(),所以我会选择一个timout,因为使用信号处理程序很方便。 – Ancurio