Ruby $stdout.get应该在何时返回输出,为什么?
我有这样的服务器模式:Ruby $stdout.get应该在何时返回输出,为什么?,ruby,multithreading,pipe,Ruby,Multithreading,Pipe,我有这样的服务器模式: sleep 5 puts 'Server started' loop { } 当我在irb中运行它时: arr=Open3.popen3('ruby server.rb') arr[1]。获取 gets块,即使我知道它应该返回'Server started',但它没有返回。 当我中断它并调用arr[1]。再次获取时,它会立即返回“服务器已启动” 如何使它在第一次arr[1]时返回输出。获取 另外,当我从服务器中删除循环{}时,它工作得非常好。您必须选择输出缓冲区: pu
sleep 5
puts 'Server started'
loop { }
当我在irb中运行它时:
arr=Open3.popen3('ruby server.rb')
arr[1]。获取
gets块,即使我知道它应该返回'Server started',但它没有返回。
当我中断它并调用arr[1]。再次获取时,它会立即返回“服务器已启动”
如何使它在第一次arr[1]时返回输出。获取
另外,当我从服务器中删除循环{}
时,它工作得非常好。您必须选择输出缓冲区:
puts 'Server started'
$stdout.flush
或启用模式:
您必须输入输出缓冲区:
puts 'Server started'
$stdout.flush
或启用模式:
loop{}
创建无限循环..@OMG因为它在单独的线程中,所以它不应该影响(put已经写入stdout…loop{}
创建无限循环..@OMG因为它在单独的线程中,所以它不应该影响(put已经写入stdout…)谢谢,@Stefan!为了更好地理解OS(和Ruby)IO,我还想读一些书,你有吗?为什么第二个get
可以工作?是否获取内部刷新?为什么不自动刷新?sync
仅在IO与终端设备关联时启用。它不限于终端设备。适用于IO设备,包括文件。终端是IO设备的一种类型:$stdout.class=>IO
并且在未重定向时,$stdout.tty?=>是的
。谢谢,@Stefan!为了更好地理解OS(和Ruby)IO,我还想读一些书,你有吗?为什么第二个get
可以工作?是否获取内部刷新?为什么不自动刷新?sync
仅在IO与终端设备关联时启用。它不限于终端设备。适用于IO设备,包括文件。终端是IO设备的一种类型:$stdout.class=>IO
并且在未重定向时,$stdout.tty?=>正确
。