正如我测试的那样,当我创建它们时,每个新代理都使用一个单独的线程。多个代理可以在一个线程中运行吗?
我的想法是创建 10K+ 轻量级代理(就像 erlang 中的演员),那么这对 Clojure 来说是一个挑战吗?
谢谢
正如我测试的那样,当我创建它们时,每个新代理都使用一个单独的线程。多个代理可以在一个线程中运行吗?
我的想法是创建 10K+ 轻量级代理(就像 erlang 中的演员),那么这对 Clojure 来说是一个挑战吗?
谢谢
这是不正确的。代理使用的线程池是核心数 + 2 大小。因此,在四核机器上,即使 10k+ 代理也只会使用 6 个工作线程。
,send
即。将send-off
启动新线程。
考虑使用 jucDelayQueue
这是它如何工作的草图,
(delayed-function
这里有点麻烦,但它基本上构造了一个 jucDelayed 的实例,用于提交到队列中。)
(import [java.util.concurrent Delayed DelayQueue TimeUnit])
(defn delayed-function [f]
(let [execute-time (+ 5000 (System/currentTimeMillis))
remaining-delay (fn [t] (.convert t
(- execute-time
(System/currentTimeMillis))
TimeUnit/MILLISECONDS))]
(reify
Delayed (getDelay [_ t] (remaining-delay t))
Runnable (run [_] (f))
Comparable (compareTo [_ _] 0))))
;;; Use java's DelayQueue from clojure.
;;; See http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/DelayQueue.html
(def q (DelayQueue.))
(defn delayed
"put the function f on the queue, it will only execute after the delay
expires"
[f]
(.offer q (delayed-function f)))
(defn start-processing
"starts a thread that endlessly reads from the delay queue and
executes the function found in the queue"
[]
(.start
(Thread.
#(while true
(.run (.take q))))))
user> (start-processing)
user> (delayed #(println "Hello"))
; 5 seconds passes
Hello
为支持(在我看来很棒)Overtone 音乐合成器而开发的 at-at 库的at
功能为在特定时间点运行功能提供了一个很好的干净接口。
(use 'overtone.at-at)
(def my-pool (mk-pool))
(after 1000 #(println "hello from the past!") my-pool)