如何在不暂停脚本的情况下收听STDIN输入?

我有一个while循环一直在监听传入的连接并将它们输出到控制台。 我希望能够通过控制台发出命令而不影响输出。 我试过了:

 Thread.new do while true input = gets.chomp puts "So I herd u sed, \"#{input}\"." #Commands would be in this scope end end 

但是,这似乎会暂停我的整个脚本,直到收到输入; 即使这样,我在此之前发起的一些线程似乎也没有执行。 我试过看TCPSocket的select()方法无济于事。

不确定您希望在示例中“继续运行”的命令在哪里。 试试这个小脚本:

 Thread.new do loop do s = gets.chomp puts "You entered #{s}" exit if s == 'end' end end i = 0 loop do puts "And the script is still running (#{i})..." i += 1 sleep 1 end 

从STDIN读取是在一个单独的线程中完成的,而主脚本继续工作。

Ruby使用绿色线程,因此阻塞系统调用将阻止所有线程。 一个主意:

 require 'io/wait' while true if $stdin.ready? line = $stdin.readline.strip p "line from stdin: #{line}" end p "really, I am working here" sleep 0.1 end