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