Haskellのような関数型プログラミング言語でプロデューサ/コンシューマを実装するにはどうすればいいですか?命令言語とはどのように異なるのでしょうか?関数型プログラミング言語の私の理解は原始的です。どんな助けもありがとう。チャネルを通過したプリエンプティブスレッドとメッセージを使用してハスケルの生産者と消費者の問題?
答えて
プロデューサ/コンシューマ抽象化:
import Data.Char
import Control.Concurrent
import Control.Concurrent.Chan
main = do
c <- newChan
cs <- getChanContents c -- a lazy stream of events from eventReader
forkIO (producer c) -- char producer
consumer cs
where
-- thread one: the event producer
producer c = forever $ do
key <- getChar
writeChan c key
-- thread two: the lazy consumer
consumer = mapM_ print . map shift
where shift c | isAlpha c = chr (ord c + 1)
| otherwise = c
あなたはErlangで同様のモデルを使用します。コンシューマとプロデューサを表すスレッド、およびそれらの間にメッセージの共有パイプがあり、それぞれ非同期的に動作します。
この回答は、この問題をどのように解決するかについて説明しています。または、より正確には、問題を解決する命令的な計算を機能的に生成する方法です。 Shivaが純粋に機能的なソリューションを探しているのだろうかと思います。 – Conal
dons
の根底にあるメカニズムはMVar
と呼ばれ、値のための必須の並列コンテナです。あなたはMVarに出入りする "put"と "get"を行います。空のMVarを得ることは、完全なものを入れることと同じです。これは同時に通信メカニズムと同期メカニズムです。 Monsoon/* tプロジェクトの一環として、Arvindによって発明されたと思います。パラレルハスケルのpH方言を説明する美しいbook by Nikhil and Arvindがあります。アイデアの多くはGHCに採用されており、この本は読み解く価値があります。
ノーマンとドンで言及したステートフルなアプローチに加えて、あなたはまた、生産者と消費者としての正常な機能のアプリケーションと怠惰と考えることができます。ここ
は自然数のプロデューサーである:そのようなPythonでC#またはジェネレータでyield return
として
squares = map (\x -> x * x) nats
プロデューサー:
nats = [1..]
そしてここでは、これらの数字の二乗を計算し、消費者でありますハスケルの単純な遅延リストのように、しばしば以下のように表現することができます。
しかし、Pythonジェネレータでは、(純粋なリストとは異なり)副作用があります。あなたもモナドリストを持つことを達成することができます。また、発電機パッケージからGeneratorTモナド変圧器とPythonでのような「歩留まり」とのそれらを生成することができます。 – yairchu
- 1. tibcoの生産者と消費者の数の差
- 2. プロデューサコアデータの消費者問題
- 3. SpringXD /春の統合:生産者と消費者
- 4. 生産者と消費者の最適化
- 5. セロリの消費者と生産者を分ける
- 6. Javaの-BlockingQueue - 複数の生産者、消費者、単一
- 7. この生産者 - 消費者のデモは?
- 8. 生産者スレッディングの消費者の誤解
- 9. プロデューサー/消費者問題の質問
- 10. カフカ消費者団体の問題
- 11. ZeroMQ + ReactPHP:複数の生産者(プッシュ)と複数の消費者(プル)
- 12. 生産と消費者のRabbitMQを使用して
- 13. プロデューサー - 消費者が一つのアイテムを生産し、すぐに(Javaの)消費
- 14. Kafka10消費者対Kafka8消費者
- 15. ActiveMQのは、フェイルオーバー輸送 - 生産者/消費者が別のホスト上で動作
- 16. キューイング:次のようにN、N個の消費者に生産
- 17. マルチプロセスウサギ消費者
- 18. 消費者は
- 19. が消費者
- 20. 複数話題のカフカ消費者
- 21. 同じ話題から消費する複数の消費者
- 22. PythonのWebSocketをは、asyncio、キュー - 生産者と消費者のメソッドを持つカスタムサーバークラスとハンドラクラス
- 23. 消費者や労働者のパターン
- 24. カフカ消費者シェルスクリプト
- 25. カフカ - 消費者。 commitAsync
- 26. テストmasstransit消費者
- 27. カフカ消費者ポーリングタイムアウト
- 28. RabbitMQ pika非同期消費者のハートビートの問題
- 29. カフカ10.2新しい消費者対古い消費者
- 30. は、私は2つのスレッド、消費者と生産者を持っているエグゼキュータの枠組み
これはhttp://stackoverflow.com/questions/1234947/can-producer-consumer-problem-be-solved-without-using-assignmentに非常に近いです。そこにあるソリューションをチェックしましたか? – nlucaroni