论坛首页 编程语言技术论坛

Ruby进程的真伪是不是我理解的这样?

浏览 2815 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-04-23   最后修改:2009-04-23
Ruby的线程肯定是假的,不废话

Ruby的进程,

--RednaxelaFX提供的win/process可以很好的新建进程--

在windows上是阻塞的,意思是通过system或者exec或者``或者Process.fork,用上面这些方式去执行一段代码,这段代码还是处于调用者的进程空间之内,会阻止调用者继续执行下面的代码,除非这段代码执行完毕。

在linux上通过使用Process.fork将是非阻塞的执行。system或者exec或者``仍然是阻塞的,调用者将等待被调用着返回。

大侠拍一下吧,小弟就这么点理解,悟性不高。

贴一段测试代码方便兄弟们理解:

p1 = Process.fork{
  while true
  sleep 1
  p "p1 1 seconds #{Process.pid};"
  `echo $$>>temp.pid`
  end
}
p2 = Process.fork{
  while true
  sleep 2
  p "p2 2 seconds #{Process.pid};"
  system("ll")
  end
}

#~ Process.detach(p1)
#~ Process.waitpid(p2)

while true
        sleep 5
        puts 'this is caller! '+Process.pid.to_s
end


执行结果 写道
"p1 1 seconds 1558;"
"p2 2 seconds 1559;"
"p1 1 seconds 1558;"
"p1 1 seconds 1558;"
"p2 2 seconds 1559;"
"p1 1 seconds 1558;"
this is caller! 1557
"p1 1 seconds 1558;"
"p2 2 seconds 1559;"
"p1 1 seconds 1558;"
"p1 1 seconds 1558;"
"p2 2 seconds 1559;"
"p1 1 seconds 1558;"
"p1 1 seconds 1558;"
this is caller! 1557
"p2 2 seconds 1559;"
"p1 1 seconds 1558;"
"p1 1 seconds 1558;"
"p2 2 seconds 1559;"
"p1 1 seconds 1558;"
"p1 1 seconds 1558;"
"p2 2 seconds 1559;"
"p1 1 seconds 1558;"
this is caller! 1557
"p1 1 seconds 1558;"
"p2 2 seconds 1559;"
"p1 1 seconds 1558;"
"p1 1 seconds 1558;"
"p2 2 seconds 1559;"
"p1 1 seconds 1558;"
"p1 1 seconds 1558;"
this is caller! 1557
"p2 2 seconds 1559;"
"p1 1 seconds 1558;"
"p1 1 seconds 1558;"
"p2 2 seconds 1559;"
"p1 1 seconds 1558;"
"p1 1 seconds 1558;"
"p2 2 seconds 1559;"
"p1 1 seconds 1558;"
   发表时间:2009-04-23  
Windows上。
require 'rubygems'
require 'win32/process'

p1 = Process.fork do
  while true
    sleep 1
    p "p1 1 seconds #{Process.pid};"
    `echo $$>>temp.pid`
  end
end

p2 = Process.fork do
  while true
    sleep 2
    p "p2 2 seconds #{Process.pid};"
    system("ll")
  end
end

#~ Process.detach(p1)
#~ Process.waitpid(p2)

while true
  sleep 5
  puts 'this is caller! '+Process.pid.to_s
end


执行结果 写道
E:\build_area\ruby187\bin>ruby z.rb
"p1 1 seconds 3100;"
"p2 2 seconds 944;"
"p1 1 seconds 3100;"
"p1 1 seconds 3100;"
"p2 2 seconds 944;"
"p1 1 seconds 3100;"
this is caller! 4004
"p1 1 seconds 3100;"
"p2 2 seconds 944;"
"p1 1 seconds 3100;"
"p1 1 seconds 3100;"
"p2 2 seconds 944;"
"p1 1 seconds 3100;"
"p1 1 seconds 3100;"
this is caller! 4004
"p2 2 seconds 944;"
"p1 1 seconds 3100;"
"p1 1 seconds 3100;"
"p2 2 seconds 944;"
"p1 1 seconds 3100;"
"p1 1 seconds 3100;"
"p2 2 seconds 944;"
"p1 1 seconds 3100;"
this is caller! 4004
"p1 1 seconds 3100;"
z.rb:24:in `sleep': Interrupt
        from z.rb:24

E:\build_area\ruby187\bin>tthis is caller! 3100his is caller! 944

tthis is caller! 944his is caller! 3100

tthis is caller! 3100his is caller! 944

this is caller! 944
this is caller! 3100
this is caller! 944
this is caller! 3100
this is caller! 944

按Ctrl+C结掉了主进程之后还有东西冒出来,只好手工把两个子ruby.exe进程给砍了。
0 请登录后投票
   发表时间:2009-04-23  
谁说Ruby的线程是假的?
0 请登录后投票
   发表时间:2009-04-23  
require 'win32/process' 

好东东啊。谢谢了!

用过一段时间开源的东西就感觉到,现在越来越多的项目天生就是要生长在linux下的,要在windows必须这个补丁那个补丁的。而以前,这种情况恰恰完全相反,比如以前linux下玩QQ,要找这个插件那个插件。哈哈哈

它出生在越位线,并长期生活在那里。
改一下:
ruby出生在linux下,并长期生活在那里。
0 请登录后投票
   发表时间:2009-04-23  
Windows 不支持 Posix 进程 fork。
而且 Windows 进程是独立于创建它的进程的。

windows:A进程 创建了 B进程,A进程被杀,B进程还活着。
fork:   A进程 创建了 B进程,A进程被杀,B进程也跟着死掉。

windows 下可以调用 win32 API CreateProcess 来产生新进程。
command = %q[ruby -e "puts 'a'"]
command << 0
params = [
    'L', # IN LPCSTR lpApplicationName
    'P', # IN LPSTR lpCommandLine
    'L', # IN LPSECURITY_ATTRIBUTES lpProcessAttributes
    'L', # IN LPSECURITY_ATTRIBUTES lpThreadAttributes
    'L', # IN BOOL bInheritHandles
    'L', # IN DWORD dwCreationFlags
    'L', # IN LPVOID lpEnvironment
    'L', # IN LPCSTR lpCurrentDirectory
    'P', # IN LPSTARTUPINFOA lpStartupInfo
    'P'  # OUT LPPROCESS_INFORMATION lpProcessInformation
]
# 这里还要写 n 行获取各种句柄及常数的语句……
startupInfo = [STARTUP_INFO_SIZE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW, 0,
      0, 0, stdin, stdout, stderr].pack('IIIIIIIIIIIISSIIII')
processInfo = [0, 0, 0, 0].pack('IIII')
createProcess = Win32API.new("kernel32", "CreateProcess", params, 'I')
createProcess.call(0, command, 0, 0, 1, 0, 0, 0, startupInfo, processInfo)
0 请登录后投票
   发表时间:2009-04-23  
CharlesCui 写道
--RednaxelaFX提供的win/process可以很好的新建进程--

改改,是Win32Util的Win32-Process啦……我还没能耐提供这样的库 XD
0 请登录后投票
   发表时间:2009-04-23  
RednaxelaFX 写道

CharlesCui 写道--RednaxelaFX提供的win/process可以很好的新建进程--
改改,是Win32Util的Win32-Process啦……我还没能耐提供这样的库 XD


呵呵,我的意思就是这个了,反正是你给出用win/process的方案么。。。谢谢啊!

night_stalker每次回复的都很有深度,值得让小弟好好学习,赞!
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics