`
CharlesCui
  • 浏览: 427481 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多
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;"
分享到:
评论
6 楼 CharlesCui 2009-04-23  
RednaxelaFX 写道

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


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

night_stalker每次回复的都很有深度,值得让小弟好好学习,赞!
5 楼 RednaxelaFX 2009-04-23  
CharlesCui 写道
--RednaxelaFX提供的win/process可以很好的新建进程--

改改,是Win32Util的Win32-Process啦……我还没能耐提供这样的库 XD
4 楼 night_stalker 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)
3 楼 CharlesCui 2009-04-23  
require 'win32/process' 

好东东啊。谢谢了!

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

它出生在越位线,并长期生活在那里。
改一下:
ruby出生在linux下,并长期生活在那里。
2 楼 potian 2009-04-23  
谁说Ruby的线程是假的?
1 楼 RednaxelaFX 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进程给砍了。

相关推荐

    Ruby-childprocess跨平台的ruby库来管理子进程

    对于更复杂的场景,如需要处理子进程的输出,你可以这样操作: ```ruby process.io.stdout = File.open("output.txt", "w") process.io.stderr = File.open("error.txt", "w") process.start process.wait ``` ...

    Ruby-Eye进程监控工具灵感来自Bluepill和God

    《Eye:Ruby进程监控工具,融合Bluepill与God之精华》 在Ruby开发领域,确保应用程序的稳定性和高效运行是至关重要的。为了达到这一目标,开发者们常常会使用到进程监控工具,它们能够帮助我们管理和控制应用进程,...

    Ruby-posixspawnRubys快速进程spawn基于posixspawn系统接口

    Ruby语言在进行进程管理时,提供了多种方法,其中之一就是`POSIX::Spawn`。这个库是Ruby的一个扩展,它提供了一种高效的方式来创建新的进程,尤其是对于Unix-like系统(包括Linux和Mac OS X)。`POSIX::Spawn`库的...

    Ruby-BluepillRuby编写的简单进程监控工具

    Ruby-Bluepill是一款由Ruby语言编写的简单而强大的进程监控工具。它被设计用来确保你的应用程序在生产环境中始终保持运行状态,即使某个进程崩溃,Bluepill也会自动重启它,从而提供了高可用性和稳定性。这个工具...

    理解Unix进程 扫描中文版.pdf

    理解Unix进程从Unix编程的基础概念着手,采用循序渐进的方法,详细介绍了Unix进程的内部工作原理。...此外,《理解Unix进程》附录部分也涉及了一些流行的Ruby项目,让读者进一步了解如何巧妙运用Unix进程。

    Ruby-轻松实现在Linux服务器上后台运行RubyRails进程

    本文将详细介绍如何实现这一目标,并提供一个名为"Procodile"的工具作为示例,它是一个用于管理Ruby后台进程的库。文件adamcooke-procodile-89c82f7可能包含了该工具的源代码。 首先,了解在Linux上后台运行程序的...

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby 小白入门指南理解 Ruby 及其特点.txt

    一、理解 Ruby 及其特点 Ruby 是一种简单快捷的面向对象脚本语言,由日本人松本行弘(Yukihiro Matsumoto)在20世纪90年代开发。它的语法简洁易懂,让程序员能够快速编写高效的代码。Ruby 的灵感来源于 Perl、...

    ruby中$~,$?是线程安全的么?

    NULL 博文链接:https://l-d.iteye.com/blog/1488038

    ruby-git, ruby/Git是一个 ruby 库,可以通过将系统调用包装到Git二进制文件来创建读取和操作Git存储库.zip

    ruby-git, ruby/Git是一个 ruby 库,可以通过将系统调用包装到Git二进制文件来创建读取和操作Git存储库 用于 ruby的 Git库在 ruby 中使用Git的库。主页项目源代码的Git public 位于:...

    ruby-string-showdown:双引号和单引号 Ruby 字符串……哪个会获胜?

    Ruby 字符串对决这是什么? 这个存储库包含一个用于 A/B 测试 Ruby 代码性能的测试工具,以及一些比较双引号和单引号字符串性能的测试。如何运行测试先决条件: Ruby(这是基于 Ruby 版本 2.2.0,但其他版本应该可以...

    Ruby进程监控器-Ruby开发

    God:过程管理的Ruby框架...使服务器进程和任务保持运行应该是部署过程中的简单部分。 God的目标是成为最简单,功能最强大的监视应用程序。 文档请参阅REPO_ROOT / doc中的内部仓库文档。 请参阅位于http:/的在线文档

    Ruby-Kamisama从Ruby启动监视和观察后台工作进程

    Ruby-Kamisama是一款用于从Ruby环境中启动、管理和监控后台工作进程的工具。它为开发者提供了方便的方式来控制长时间运行的任务,比如定期执行的作业、守护进程或者任何需要在后台独立运行的逻辑。Kamisama的名字...

    Ruby完全自学手册 下

    希望借助于平易的讲解,让读者在学习的过程中,理解Ruby的编程思想,充分享受编程的乐趣,通过《Ruby完全自学手册》进入Ruby开发的殿堂。同时也希望能够与各位读者分享多年来积累的Ruby程序和网站开发的经验。 ...

    为何Ruby 1.9的不兼容性会导致原有Ruby代码无法工作

    Ruby 1.9 的发布对Ruby社区带来了显著的变化,尤其是其与之前的1.8版本之间的不兼容性。这种不兼容性源于对Ruby语言及其核心库的深入...对于那些希望跟上Ruby最新进展的程序员来说,理解和应对这些不兼容性至关重要。

    Ruby语言教程大纲.zip

    Ruby是一种面向对象的脚本语言,以其简洁、优雅的语法和强大的编程能力而闻名。这份“Ruby语言教程大纲”可能是为了指导初学者或有经验的开发者系统地学习Ruby语言而设计的。以下是对Ruby语言的一些核心知识点的详细...

    ruby DBI ruby DBI ruby DBI

    ruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ...

    Ruby:Ruby模块与包的深入理解与应用

    Ruby:Ruby模块与包的深入理解与应用

    Ruby-Puma一个Ruby的并发Web服务器

    Ruby-Puma是一个高性能、轻量级且并发的Web服务器,专为Ruby编程语言设计。它在Ruby社区中广泛用于构建Web应用程序,特别是与Rails框架一起使用。Puma的设计目标是提供稳定、快速和易于管理的服务,同时保持低内存...

    ruby-macho, 解析Mach文件的纯 ruby 库.zip

    ruby-macho, 解析Mach文件的纯 ruby 库 ruby 用于检查和修改mach文件的ruby 库。什么是mach文件?文件格式由 OS X 和 iOS ( 它的他人) 用于目标文件。可执行文件。动态库等的通用二进制格式。文档完整的文档可以在 ...

Global site tag (gtag.js) - Google Analytics