gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:47:02 25 4
gpt4 key购买 nike

Ryan Tomayko 用 this post 引发了一场激烈的 Storm 关于使用 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.

我有一些代码(DataMapper 的 delayed_job 克隆,我认为它适合这个,但我不清楚如何利用列出的命令。任何想法关于如何改进此代码?

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 将进程转变为守护进程。相同的系统调用,不同的目的。在前台(不使用 fork)运行 delayed_job 与在后台(使用 fork)运行 delayed_job 的性能差异可以忽略不计。

但是,如果您编写一个接受并发连接的服务器,现在 Ryan 的建议是对的。

  • fork:创建原始进程的副本
  • execve:停止执行当前文件并开始在同一进程中执行新文件(在 rake 任务中非常有用)
  • pipe:创建管道(两个文件描述符,一个读,一个写)
  • socketpair:类似管道,但用于套接字
  • select:让您等待多个文件描述符中的一个或多个准备好超时
  • kill:用于向进程发送信号
  • sigaction:让您可以更改进程收到信号时发生的情况

关于ruby - 在 Ruby 中使用 Unix 进程控制方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1604821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com