【问题标题】:Multi-threading IO多线程IO
【发布时间】:2014-10-03 12:39:03
【问题描述】:

我正在尝试为 Ruby 制作一个交互式 telnet 客户端。当前的库非常缺乏,因此我一直试图通过创建一个交互式 gem 来添加它,该 gem 允许用户使用 telnet 实时简化数据。为此,我需要使用多线程:

t1 接受用户输入。用户必须始终具有通过整个应用程序输入数据的能力。发送用户数据后,我们将立即收到数据,这些数据将被我们的块 { |c| print c } 捕获。问题是我们希望将数据精简给我们。换句话说,现在我们只收到在我们发送一些东西后发回的数据,我们希望在我们发送命令后一分钟内接收到数据。我们希望数据源源不断地流向我们。

我为此目的制作了 t2。 t2 等待接收数据,然后在其正则表达式模式匹配时显示它。 t2 的问题是,如果从未收到数据,则用户无法在 t1 中输入信息。

t3 在 t1 和 t2 上运行。 我的问题是如何组织我的线程,使用户可以不断地输入控制台并提交命令,同时不断地从服务器接收信息?

t1 = Thread.new {
  while true
    input = gets.chomp
    localhost.cmd(input) { |c| print c }
  end
}

t2 = Thread.new {
  puts localhost.waitfor("Prompt" => /[$%#>:?.|](\e\[0?m\s*)* *\z/)
}

t3 = Thread.new {
  t1.join
  t2.join
}

t3.join

【问题讨论】:

  • 你的t3 线程没用。您可以直接致电t1.joint2.join。我认为 localhost.waitfor 方法正在阻塞整个 localhost 对象,可能使用互斥锁或其他东西。你能提供更多代码吗?喜欢localhost.waitforlocalhost.cmd的来源?

标签: ruby multithreading telnet telnetlib


【解决方案1】:

问题是我们希望将数据精简给我们。其他 换句话说,现在我们只得到发送后发回的数据 某事,

require 'thread'

user_data = Queue.new

t1 = Thread.new do
  loop do
    print "Enter data: "
    line = gets.chomp

    if line == ""
      user_data << "END_OF_DATA"
      break
    else
      user_data << line
    end

  end
end.join

t2 = Thread.new do
  processed_data = []

  loop do
    line = user_data.shift
    break if line == "END_OF_DATA"
    processed_data << line
  end

  p processed_data
end.join

您可能想阅读以下内容:

https://www.rfc-editor.org/rfc/rfc854

【讨论】:

    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多