0

現在Clojureを学習しており、STMを使用して並行処理を行う方法がわかりません。私が達成しようとしている作業は非常に簡単です。文字列のベクトルがあり、それぞれの文字列に対して同時に関数を実行し、その文字列を関数が返すものに置き換えたいと思います。ClojureのSTMとの並行性

私は現在のpmapで非常に簡単にこれを行うことができます。

(pmap function string_vector) 

は、どのように私はClojureの中でSTMを使用して、この同じことを行うことができますか?

+1

私はこれを閉じるために投票しました。この問題は、解決の問題に関連する問題としてSTMにつながるスレッドコーディネーションの領域に要件がないため、うまくいきません。食器洗い機を使ってリンゴを食べる方法は? –

答えて

2

STMは、スレッド間でデータを共有する方法です。まったく調整する必要がない場合(この例ではない)、STMを使用する本当の理由はありません。

+0

私は理解します。私はちょうど学習目的のために知りたい。私はSTMを理解するのに苦労しています。何か助けていただければ幸いです。 – Pythoner

+0

@Pythoner、それが「学習目的」のためだけであるからといって、それが意味をなさないはずはありません。あなたが求めているのは、「私は飛行機を持っています。私はそれを使って(車)を運転する方法を学ぶのですか?確かに、高速道路に沿って飛行機にタクシーを乗せることができます。しかし、あなたは実際に車を運転することは賢明ではありません。彼らはまったく異なる機械で、目的がまったく違っていて、違った方法で制御されています。 –

1

クロージャーのSTMは、時間の経過とともに変化するものの状態を維持することについてです。時々刻々と変化する状態を持つこれらの事柄は、「アイデンティティ」を持っていると言われています。 3ヶ月の "あなた"が120歳の時に "あなた"を認識しなくても、あなたの人生全体の "あなた"であるアイデンティティを持っているように。この中

user> (def current-strings (ref ["a" "b" "c"])) 
#'user/current-strings 
user> (dosync (alter current-strings (fn [the-string-at-this-instant] 
             (pmap #(.toUpperCase %) the-string-at-this-instant)))) 
("A" "B" "C") 
user> @current-strings 
("A" "B" "C") 
user> 

を:のは、文字列を格納し、並行して存在し、それらを変更するには、一般に入手可能な可変な場所を作ってみましょう

:我々はSTMを使用するための言い訳を持っているので、だからあなたの例では、可変何かを置くことができます例として、関数を適用して文字列コレクションの状態を変更したトランザクションを作成しました。内部的には、その関数が新しい値を並列して計算していました。それ自身のトランザクション内で独立して変更可能なもの、それぞれの束このより興味深いのは、可変物事のベクトルを作りましょう行い、その後、並列更新中にする

:あなたが見ることができるように

user> (def current-strings [(ref "a") (ref "b") (ref "c")]) 
#'user/current-strings 

user> (doall 
     (pmap (fn [ref-to-update] 
       (dosync (alter ref-to-update #(.toUpperCase %)))) 
      current-strings)) 
("A" "B" "C") 

user> (map deref current-strings) 
("A" "B" "C") 
user> 

を、これのどれもSTMが必要です。なぜなら、これらすべての操作は、他の変更可能なタイプのクロージャーで処理できるため、アトムは大きな選択肢になります。そしてrefsで遊ぶのも楽しいです!楽しむ!

+1

ここで注意してください。 pmapはマップと同様に怠惰なので、単に副作用を評価するだけでなく、すべての結果が実現していることを確認したい場合は、すべてを強制する必要があります。あなたがreplでこれを印刷することが起こらなかった場合、これらの変更は保証されませんでした(実際チャンク化のため最初の32個だけが発生します)。 https://gist.github.com/amalloy/906a65d5851ab61554b12482a8dbcb4aの32が繰り返されていることに注意してください。 – amalloy

+0

良い点!ここでは「怠惰なバグ」が潜んでいます。私はそこに 'doall'を入れました。 dosyncをpmapの外側に置くと、動作しません。 –

+2

それは意味がありません。文字列でdoallを呼び出しています。これはノーオペレーションです。繰り返しますが、それが正しいかどうかを確認するためにreplに結果を出力せずに、32以上の要素を持つもので試してみてください。 pmapの結果を内部ではなくすべて行う必要があります。 – amalloy