在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:让你改变一个进程收到信号时会发生什么

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...