Как мне прослушать ввод STDIN, не останавливая мой сценарий? - PullRequest
3 голосов
/ 13 января 2011

У меня есть цикл while, постоянно прослушивающий входящие соединения и выводящий их на консоль. Я хотел бы иметь возможность выдавать команды через консоль, не влияя на вывод. Я пробовал:

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

Однако, похоже, это приостанавливает весь мой сценарий, пока не будет получен ввод; и даже тогда некоторые потоки, которые я инициировал до этого, похоже не выполняются. Я пытался посмотреть на метод select() TCPSocket безрезультатно.

Ответы [ 2 ]

5 голосов
/ 13 января 2011

Не уверен, где находятся команды, которые вы хотите «продолжить выполнение» в вашем примере. Попробуйте этот небольшой скрипт:

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 выполняется в отдельном потоке, в то время как основной скрипт продолжает работать.

2 голосов
/ 13 января 2011

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...