微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Ruby中使用Unix进程控制方法

Ryan Tomayko触发了 this post关于使用Unix进程控制命令的相当火灾.

We should be doing more of this. A lot more of this. I’m talking about fork(2),execve(2),pipe(2),socketpair(2),select(2),kill(2),sigaction(2),and so on and so forth. These are our friends. They want so badly just to help us.

我有一些代码(一个delay_job克隆的DataMapper,我认为适合这个,但我不清楚如何利用列出的命令.任何想法如何改进这个代码

def start
  say "*** Starting job worker #{@name}"
  t = Thread.new do
    loop do
      delay = Update.work_off(self)
      break if $exit
      sleep delay
      break if $exit
    end
    clear_locks
  end

  trap('TERM') { terminate_with t }
  trap('INT')  { terminate_with t }

  trap('USR1') do
    say "Wakeup Signal Caught"
    t.run
  end
end

解决方法

啊是的……“我们应该多做这些事情的危险”,而不是说明每一个人的做法,以及你在什么情况下使用它们的危险.对于像delayed_job这样的东西,你甚至可以使用fork,而不知道你使用fork.话虽如此,真的没关系. Ryan正在谈论使用fork来预订服务器. delayed_job将使用fork将进程转换成守护进程.相同的系统调用,不同的目的.在后台运行delayed_job(没有fork)vs在后台(fork)会导致性能差异的微不足道.

但是,如果你写一个接受并发连接的服务器,那么现在Ryan的建议是正确的.

> fork:创建原始进程的副本> execve:停止执行当前文件,并在同一进程中开始执行新文件(在耙子任务中非常有用)> pipe:创建一个管道(两个文件描述符,一个用于读取,一个用于写入)> socketpair:像一个管道,但是用于套接字>选择:让我们等待一个或多个多个文件描述符准备好超时kill:用于向进程发送一个信号sigaction:让你改变一个进程收到信号时会发生什么

原文地址:https://www.jb51.cc/ruby/267154.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐