Clojureプログラムで無限演算を実装する必要があります。Javaプログラマーにとっても、構文がかなり明確であることを願っています。
(defn- my-operation
(future
(while @continue
(do things)
(Thread/sleep polling-time)))
それは私が欲しいもの、別のスレッドでの操作、つまりメインのスレッドをブロックしないこと、そしてドット特殊形式を使用するように強制するネイティブJava関数を処理する必要のないかなり明確で単純な構文を私に与えます。
しかし、Javaの将来の定義は「非同期計算の結果の表現」であり、この場合、私はその結果に対して実際には何もしていません。
これは、Clojureが管理するスレッドプール内のスレッドを拘束し、そのようなものに使用します。そのスレッドプールの使用目的は、短時間実行される操作のためのものであり、一種の誤用です。また、の背後にある意図future
は、値を1回計算して複数回逆参照できるようにすることです。これも一種の誤用です。
Javaのエグゼキューターフレームワークの使用、コア非同期、独自のスレッドの開始など、長時間実行するタスクには他にも多くのオプションがあります。
(defonce background-thread (doto (Thread. (fn []
(while @continue
(do things)
(Thread/sleep polling-time))))
(.setDaemon true)
(.start)))
他の人が述べたように、未処理の例外について考えることは価値があるかもしれません。Stuart Sierraのブログ投稿は、始めるのに最適な場所です。
のdocstring future
は、呼び出すことができるものを返すことを示していますderef
。それは同じように、delay
またはそれatom
と同じように参照型であり、それがどのように値を取得するかについての独自のセマンティクスを持ち、trueである場合、futureを作成してそれを永久に実行することができます。あなたがそれが生み出す価値を気にすること。
(clojure.repl/doc future)
-------------------------
clojure.core/future
([& body])
Macro
Takes a body of expressions and yields a future object that will
invoke the body in another thread, and will cache the result and
return it on all subsequent calls to deref/@. If the computation has
not yet finished, calls to deref/@ will block, unless the variant of
deref with timeout is used. See also - realized?.
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加