2012-08-07 49 views
2

正如我測試創建10K +劑,一個單獨的線程用於每個新的代理,當我創建它們。 幾個代理可以在一個線程中運行嗎?Clojure中

我的想法是創建10K +輕量的藥劑(如在二郎演員),所以它Clojure的挑戰?

感謝

+1

這些是什麼藥該怎麼辦? – dimagog 2012-08-07 19:27:04

回答

9

這是不正確。代理使用線程池,該線程池是核心數+2的大小。因此,在四核機器上,即使10k +代理也只能使用6個工作線程。

隨着send,那是。隨着send-off新線程將開始。

+0

感謝,但看例如下一個動作功能: '(DEFN INC狀態[A] (調用println一(主題/ currentThread)) (主題/睡眠5000) (調用println一個 '完成') (合併一個{:狀態(INC(A:狀態))}) )' 我要讓劑能在5個secods發送響應,但使用線程/睡眠 - 它需要一個線程,並不允許其他代理使用線程。我需要另一種方式在一段時間後發送動作 – Alex 2012-08-07 13:54:54

3

考慮使用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 
+0

感謝, 假設我們有正在執行的代理,我們有一個延遲功能,發送給執行機構的動作。那麼它會並行運行還是等待代理完成當前函數的執行? – Alex 2012-08-08 09:50:47

0

the at-at libraryat功能的開發是爲了支持(在我看來夢幻般的)顯性一個音樂合成器提供了一個非常乾淨的interfase用於在特定時間點運行功能

(use 'overtone.at-at) 
(def my-pool (mk-pool)) 
(after 1000 #(println "hello from the past!") my-pool)