浏览 2815 次
锁定老帖子 主题:Ruby进程的真伪是不是我理解的这样?
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-23
最后修改:2009-04-23
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;" 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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进程给砍了。 |
|
返回顶楼 | |
发表时间:2009-04-23
谁说Ruby的线程是假的?
|
|
返回顶楼 | |
发表时间:2009-04-23
require 'win32/process'
好东东啊。谢谢了! 用过一段时间开源的东西就感觉到,现在越来越多的项目天生就是要生长在linux下的,要在windows必须这个补丁那个补丁的。而以前,这种情况恰恰完全相反,比如以前linux下玩QQ,要找这个插件那个插件。哈哈哈 它出生在越位线,并长期生活在那里。 改一下: ruby出生在linux下,并长期生活在那里。 |
|
返回顶楼 | |
发表时间: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) |
|
返回顶楼 | |
发表时间:2009-04-23
CharlesCui 写道 --RednaxelaFX提供的win/process可以很好的新建进程--
改改,是Win32Util的Win32-Process啦……我还没能耐提供这样的库 XD |
|
返回顶楼 | |
发表时间:2009-04-23
RednaxelaFX 写道 CharlesCui 写道--RednaxelaFX提供的win/process可以很好的新建进程-- 改改,是Win32Util的Win32-Process啦……我还没能耐提供这样的库 XD 呵呵,我的意思就是这个了,反正是你给出用win/process的方案么。。。谢谢啊! night_stalker每次回复的都很有深度,值得让小弟好好学习,赞! |
|
返回顶楼 | |