gpt4 book ai didi

ruby - 讨论一个子进程,将 Ruby 与 IO 和线程一起使用

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:38 26 4
gpt4 key购买 nike

我正在尝试使用 IO.popen 将消息从进程放入(使用 .puts 方法)和获取(使用 .gets 方法)到其子进程。

我不是很实验,我有一个问题。有以下代码,我有一个错误,因为不可能在一个封闭的流中写入。

class Interface
def initialize(path)
@sub_process = IO.popen(path, 'w+')
end

def start!
if ok?
@sub_process.puts 'Hello', 'my name is ...'
# and more...
end
end

protected

def ok?
is_ready?(@sub_process) && is_cool?(@sub_process)
end

def is_ready?(sub_process)
reply = process_command(sub_process, 'are u ready?')
reply.chomp.match(/yes_i_am_ready$/)
end

def is_cool?(sub_process)
reply = process_command(sub_process, 'are u cool?')
reply.chomp.match(/yes_i_am_cool$/)
end

def process_command(sub_process, command)
rdr = Thread.new { sub_process.read } # alternative: io.readlines
sub_process.puts "#{command}"
sub_process.close_write
rdr.value # joins and fetches the result
end
end

a = Interface.new("./program")
a.start!

(...) in `write': not opened for writing (IOError)

正如我们所见,这个错误发生在 is_cool?测试(如解释于:http://ruby-doc.org/core/classes/IO.html#M002289)。

但是如果我尝试在 process_command 方法中注释行:

# sub_process.close_write

脚本似乎在休眠......无限:s

我相信不可能再次打开一个关闭的流。而且我无法创建我的程序“./program”的另一个 IO.popen 实例,因为它需要在开始之前用一些命令(比如“你准备好了吗?”和“你酷吗?”)初始化我使用它(通过像简单讨论一样发送和接收消息)。

如何修改当前代码来解决这个问题?

编辑:换句话说,我想建立这样的通信(根据给定的协议(protocol)):

Parent message:                Child answer:
-------------- ------------

'are u ready?' 'yes_i_am_ready'
'are u cool?' 'yes_i_am_cool'
'Hello' 'foo'
'my name is ...' 'bar'

非常感谢您的帮助。

最佳答案

也许有一个工作示例会有所帮助。这是一个经过测试并已知可以在 Linux 上的 MRI 1.8.7 中工作的。

bar.rb

#!/usr/bin/ruby1.8

begin
loop do
puts "You said: #{gets}"
$stdout.flush
end
rescue Errno::EPIPE
end

foo.rb

#!/usr/bin/ruby1.8

class Parent

def initialize
@pipe = IO.popen(CHILD_COMMAND, 'w+')
end

def talk(message)
@pipe.puts(message)
response = @pipe.gets
if response.nil?
$stderr.puts "Failed: #{CHILD_COMMAND}"
exit(1)
end
response.chomp
end

private

CHILD_COMMAND = './bar.rb'

end

parent = Parent.new
puts parent.talk('blah blah blah')
puts parent.talk('foo bar baz')

foo.rb 输出

You said: blah blah blah
You said: foo bar baz

关于ruby - 讨论一个子进程,将 Ruby 与 IO 和线程一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2362856/

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