私の質問と非常によく似た別の質問を見つけました.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 呼び出し) が他のスレッドをブロックしていることと関係があるということですか?
私はスレッド化が初めてなので、手がかりがありません。