【问题标题】:Efficient daemon in ValaVala中的高效守护进程
【发布时间】:2012-09-24 08:54:21
【问题描述】:

我想在 Vala 中创建一个守护程序,它每 X 秒才执行一次任务。 我想知道哪个是最好的方法:

  1. Thread.usleep() 或 Posix.sleep()
  2. GLib.MainLoop + GLib.Timeout
  3. 其他?

我不希望它在无所事事的时候吃太多资源..

【问题讨论】:

  • 出于好奇:如果 cron 无法处理,这是什么任务?
  • 更换壁纸..我知道那里有很多壁纸更换器,但我想自己做一个,想知道最好的方法是什么。
  • 嗯,我不认为有那么大的区别。无论如何,每个解决方案都可能会在某个时候或另一个时候调用系统 sleep(),所以我会选择一个 timout,因为使用信号处理程序很方便..

标签: performance daemon vala


【解决方案1】:

如果您将时间花在系统调用中,则从性能角度来看不会有任何明显的差异。也就是说,使用 MainLoop 方法可能是有意义的,原因有两个:

  1. 您将需要设置信号处理程序,以便您的守护程序在收到 SIGTERM 后立即死亡。如果您通过Posix.signal 绑定SIGTERM 在主循环上调用quit,那么这可能是一段比检查睡眠是否成功更易读的代码。

  2. 如果您决定增加复杂性,MainLoop 将使其更直接。

【讨论】:

    【解决方案2】:

    您可以通过以下方式使用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,因为它在后台运行,应该优先考虑其他任务。

    【讨论】:

    • 对于这样的事情,您可能希望使用GLib.Timeout.add_seconds,而不是add,尤其是因为最初提出该问题时着眼于性能。
    • @nemequ 感谢您提供信息,刚刚更新了示例;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多