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

前端之家收集整理的这篇文章主要介绍了在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,我认为适合这个,但我不清楚如何利用列出的命令.任何想法如何改进这个代码

  1. def start
  2. say "*** Starting job worker #{@name}"
  3. t = Thread.new do
  4. loop do
  5. delay = Update.work_off(self)
  6. break if $exit
  7. sleep delay
  8. break if $exit
  9. end
  10. clear_locks
  11. end
  12.  
  13. trap('TERM') { terminate_with t }
  14. trap('INT') { terminate_with t }
  15.  
  16. trap('USR1') do
  17. say "Wakeup Signal Caught"
  18. t.run
  19. end
  20. end
@H_403_10@

解决方法

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

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

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

@H_403_10@ @H_403_10@

猜你在找的Ruby相关文章