私は小さなclojurepub/subインターフェースを書いています。これは非常に必要最低限のものであり、実際に使用されるのはdo-pubとsub-listenの2つの方法だけです。sub-listenは文字列(サブ名)を取り、do-pubは2つの文字列(サブ名と値)を取ります。
私はまだclojureにかなり慣れていないので、これを実行する方法を考え出すのに問題があります。私の最初の考え(そして実際に私の最初の実装)は、ハッシュを保持する単一のエージェントを使用します:
{ subname (promise1 promise2 etc) }
スレッドがsubを実行したい場合、conjはpromiseオブジェクトを、必要なsubに関連付けられたリストに追加し、すぐにそのpromiseの参照を解除しようとします(したがってブロックします)。
パブが発生すると、サブのリスト内のすべてのアイテムを調べて、そのアイテムに値を提供します(約束)。次に、そのサブネームをマップから分離し、エージェントに返します。
このようにして、単純なpubサブ実装が機能するようになりました。ただし、問題は、誰かがサブスクライブし、一定時間パブを受け取らなかった後、タイムアウトのために殺された場合に発生します。このシナリオでは、エージェントに必要のない無価値な約束があり、さらに、そのサブが公開されない場合、これはメモリリークの原因になります。
誰かがこれを解決する方法について何か考えがありますか?または、私が全体的にやろうとしていることを行うためのより良い方法がある場合(外部の事前に作成されたpubsubライブラリの使用を避けようとしているので、これはペットプロジェクトであり、機能するものではありません)?