2017-02-09 9 views
1

関数に値を返す方法はありますか?その関数でスレッドを呼び出す方法はありますか?たとえば:関数に値を返すと、同じ関数でスレッドが開始されますか?

def foo 
    return fast_function 
    Thread.new do 
    slow_function 
    end 
end 

この背後にある理由は、同じリソースへのfast_functionslow_function書き込みの両方ということです。しかし、fast_functionが実行されて最初に完了し、が共有リソースに書き込まれる前にその値をfooに戻す必要があります。 slow_functionfast_functionより前に完了し、競合状態になる場合があります。

EDIT: 問題の詳細なコンテキスト。これは実装しようとしているサーバー側のイベントに関連しています。私はfast_functionを取得して、イベントIDとリターンとHTMLを計算しようとしています。 slow_functionは、イベントIDを介してクライアントにプロセスが完了したことを通知する役割を担います。しかし、slow_functionは、クライアントイベントがリッスンする場所を知る前にクライアントに通知します。これは、fast_functionがまだイベントIDを返さなかったためです。

+0

を鳴らします。スレッド間で変更可能なデータを持つことは望ましくありません。これは主要なコードの匂いです。 – Anthony

答えて

0

いいえ、リターンは関数を終了し、yieldブロックの関数も終了します。私の意見では、この問題に対する複数の解決策があります。このようなものに

実際には同時ルビーの約束のために完璧にフィットするでしょう(https://github.com/ruby-concurrency/concurrent-ruby

あなたはできます

def foo 

    fast = Concurrent::Promise.execute{ fast_function } 
    slow = promises[:fast].then{ slow_function } 
         .on_fullfill{ notify_client } 
    return fast.value 
end 

あなたはそれがあなたの値を返します推測できるとおり高速機能。 しかし、slow関数が終了している場合は、on_fullfill関数(またはproc)も呼び出されます。そして、最も重要なことは、それは秩序を保証するでしょう。

注:ブーススレッドを同時に開始したいが、速いものが最初に終了していることを確認するには、正しく理解しているかどうかはわかりません。あなたはこのような何かを行うことができます。

fast = Concurrent::Promise.execute{ fast_function } 
slow = Concurrent::Promise.execute{ slow_function } 

render fast.value # Or what you ever do with the html. 
        #.value will wait for the Promise to finish. 
result slow = slow.value 

この方法であなたはブースの機能を平行に起動しますが、あなたは速いもののための最初の答えになるだろうしてください。


編集1:私はこれについてthougth、と私はあなたがすべてで非同期タスクを持つようにしたい場合は本当にわかりません。あなたが最小の例(coruseの正しいもの)を投稿して以来、伝えるのは難しいです。 あなただけの正しい順序でbotth機能リターンを返す関数を持っているしたい場合は、あなただけの収量行うことができます:あなたは、同期コードが非同期ではないしたいよう

def foo 
    yield fast_function 
    yield slow_function 
end 
関連する問題