2017-01-05 4 views
-1

私は一連のタスクを完了する必要があります。タスクロジックをメソッドから別のクラスにリファクタリングした後、パフォーマンスがもはや連続していることが保証されなくなりました(つまり、最初のタスクが完了する前に2番目と3番目のタスクが開始されます)。ここでは何が起こっているのですか、順次パフォーマンスを保証するにはどうしたらいいですか?Ruby - 逐次実行を実行する方法

class MyClass 
    def do_stuff 
    FirstThing.new.do_it 
    SecondThing.new.do_it 
    ThirdThing.new.do_it 
    end # for some reason, each doesn't wait for its predecessor to finish before starting 
end 

class FirstThing 
    def do_it 
    # takes a minute to complete 
    end 
end 

class SecondThing 
    def do_it 
    # takes a minute to complete 
    end 
end 

class ThirdThing 
    def do_it 
    # takes a minute to complete 
    end 
end 

EDIT:リファクタリングコードのように見える

class MyClass 
    def do_stuff 
    do_first_thing 
    do_second_thing 
    do_third_thing 
    end # each waits for its predecessor to finish before starting 

    def do_first_thing 
    # takes a minute to complete 
    end 

    def do_second_thing 
    # takes a minute to complete 
    end 

    def do_third_thing 
    # takes a minute to complete 
    end 
end 

:のよう

元のコードは見えないスレッド又は並列処理が起こっていない又は所望されます。

EDIT:問題を再現するために次のコードを使用しましたが、動作しているようですが、問題は別の場所にある可能性があります。進歩と結果をここに掲載します。で期待どおり

# 
# OLD VERSION 
# 

class OldJob 
    def work_it 
    move_it 
    shake_it 
    bake_it 
    end 

    def move_it 
    puts "MOVING IT..." 
    sleep 5 
    end 

    def shake_it 
    puts "SHAKING IT..." 
    sleep 5 
    end 

    def bake_it 
    puts "BAKING IT..." 
    sleep 5 
    end 
end 

OldJob.new.work_it 

puts "-----------" 

# 
# NEW VERSION 
# 

class MoveJob 
    def do_it 
    puts "MOVING IT..." 
    sleep 5 
    end 
end 

class ShakeJob 
    def do_it 
    puts "SHAKING IT..." 
    sleep 5 
    end 
end 

class BakeJob 
    def do_it 
    puts "BAKING IT..." 
    sleep 5 
    end 
end 

class NewJob 
    def work_it 
    MoveJob.new.do_it 
    ShakeJob.new.do_it 
    BakeJob.new.do_it 
    end 
end 

NewJob.new.work_it 

結果:

ruby --->> ruby ~/Desktop/my_job.rb 
MOVING IT... 
SHAKING IT... 
BAKING IT... 
----------- 
MOVING IT... 
SHAKING IT... 
BAKING IT... 

FINAL EDIT:

だから、私はその、クラス名の一部をmisnamedていたが、複数の同様のクラスにリファクタリングする私の急いで判明彼らの処刑は起こらなかった。従属クラスは、それが行われていないため、以前のプロセスの結果にアクセスできませんでした。興味深いのは、クラス名のあいまいさに関係するエラーは見られなかったことです。根本的な原因です。

問題が解決しました。お気軽に削除してください/この質問を閉じる。

+0

あなたのメソッドで正確に何が起こっているかについての詳細を提供したい場合は、メソッド内で非同期処理を行っているように聞こえるので、取得するためにいくつかのものを書き直す必要があります順番に評価する。 – GDP2

+0

具体的な問題を明確にしてください。現在書かれているように、間違っていることを正確に伝えるのは難しいです。 – akuhn

+1

ここでは@ GPD2に同意します。投稿したコードは順番に動作します。 –

答えて

1

私はあなたのタスクが別のスレッドで実行されていると考えています。

別々のスレッドで実行されていると仮定すると、コールバックを使用してそれを順次にすることができます。これらはJavascriptでより一般的ですが、確かにRubyでも実行可能です。あなたのMyClass#do_stuff方法は、すぐにではないが返されます

FirstThing.new.run do 
    SecondThing.new.run 
end 

注:、その後、最初のタスクを実行するコールバック

class FirstThing 
    def do_it(&callback) 
    Thread.new do 
     # do stuff 
     callback.call 
    end 
    end 
end 

を受け入れるようにタスクを定義するコールバックで2番目のタスクを呼び出す

例コールバックが終了するのを待ちます。何らかのブロッキングループがなければ、非同期コードを同期させることは不可能です。

+1

'do_it'、' run'または 'do_stuff'ですか? :) –

関連する問題