2

私の質問と非常によく似た別の質問を見つけました.1つの簡単なスクリプトですべてを書いたときにうまくいった解決策があります. 私がやろうとしていることをシミュレートするような 2 番目の簡単な例も書きましたが、それでも機能しているように見えました。

私のシミュレーションは次のとおりです。

class A
  def looper(&block)
    Thread.new do
      loop do
        exit if gets.chomp == 'q'
      end
    end
    loop do
      block.call
    end
  end
end

class B < A
  def looper
    super do
      puts 'howddyyyy from B'
    end
  end
end

これは正常に機能し、 を押すと終了しますq<Enter>。しかし、これを実際のプロジェクトに実装しようとすると、うまくいきません。親クラスは上記の例と文字通りまったく同じであるため、問題のメソッドのコードを子クラスに投稿します。

def looper
  super do
    if obj = Object.first(:process_status => STATUS_UNPROCESSED)
      puts "[Object ##{obj.id}] Processing..."
      puts "-" * 60

      obj.set_failed
      if @obj.process(obj)
        obj.set_processed
      end

      puts "-" * 60
      puts "[Object ##{obj.id}] Finished!"
      puts
      puts
    else
      sleep 10
    end
  end
end

したがって、何らかの理由で、これは機能しません。puts新しいスレッドに a を入れて( をリッスンq)、 のすべてのループの前に puts を出力するようですblock.call。キーを取得できていないだけかもしれません。つまり、入力する必要がある時間枠がq<Enter>短すぎるのかもしれません。よくわからないので、ここでアドバイスを求めています。私の他の唯一の推測は、このメソッド内で呼び出されたメソッド (プロセス、またはデータベースへの Sequel 呼び出し) が他のスレッドをブロックしていることと関係があるということですか?

私はスレッド化が初めてなので、手がかりがありません。

4

1 に答える 1

1

よし、みんな。5分も経たないうちに解決策にたどり着いたので(そして、スタックオーバーフローで見落としていた解決策にたどり着きました)、すべてを入力するのは少しばかげていると感じます。

将来同様の問題に直面する人のために、これは私が最終的に行ったことです(親クラスで):

def looper(&block)
  interrupted = false
  trap("INT") { interrupted = true }
  until interrupted do
    block.call
  end
  exit
end

これにより、私が本質的にやろうとしていたことが達成されました。

読んでくれてありがとう!

于 2013-05-14T22:57:27.427 に答える