正如我測試創建10K +劑,一個單獨的線程用於每個新的代理,當我創建它們。 幾個代理可以在一個線程中運行嗎?Clojure中
我的想法是創建10K +輕量的藥劑(如在二郎演員),所以它Clojure的挑戰?
感謝
正如我測試創建10K +劑,一個單獨的線程用於每個新的代理,當我創建它們。 幾個代理可以在一個線程中運行嗎?Clojure中
我的想法是創建10K +輕量的藥劑(如在二郎演員),所以它Clojure的挑戰?
感謝
這是不正確。代理使用線程池,該線程池是核心數+2的大小。因此,在四核機器上,即使10k +代理也只能使用6個工作線程。
隨着send
,那是。隨着send-off
新線程將開始。
感謝,但看例如下一個動作功能: '(DEFN INC狀態[A] (調用println一(主題/ currentThread)) (主題/睡眠5000) (調用println一個 '完成') (合併一個{:狀態(INC(A:狀態))}) )' 我要讓劑能在5個secods發送響應,但使用線程/睡眠 - 它需要一個線程,並不允許其他代理使用線程。我需要另一種方式在一段時間後發送動作 – Alex 2012-08-07 13:54:54
考慮使用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
感謝, 假設我們有正在執行的代理,我們有一個延遲功能,發送給執行機構的動作。那麼它會並行運行還是等待代理完成當前函數的執行? – Alex 2012-08-08 09:50:47
的the at-at library的at
功能的開發是爲了支持(在我看來夢幻般的)顯性一個音樂合成器提供了一個非常乾淨的interfase用於在特定時間點運行功能。
(use 'overtone.at-at)
(def my-pool (mk-pool))
(after 1000 #(println "hello from the past!") my-pool)
這些是什麼藥該怎麼辦? – dimagog 2012-08-07 19:27:04