2012-08-07 3 views
2

Как я протестировал, отдельный отдельный поток используется для каждого нового агента при его создании. Можно ли запустить несколько агентов в одном потоке?Создание агентов 10k + в clojure

Моя идея - создать 10K + легковесные агенты (например, актеры в erlang), так что это вызов для Clojure?

СООБЩЕНИЕ

+1

Что будут делать эти агенты? – dimagog

ответ

9

Это неверное описание. Агенты используют пул потоков, который представляет собой число ядер + 2. Таким образом, на четырехъядерной машине даже агенты 10k + будут использовать только 6 рабочих потоков.

С send, то есть. С send-off новых потоков будет запущен.

+0

Спасибо, но посмотрите, например, следующую функцию действия: '(defn вкл-состояние [а] (Println а (Тема/currentThread)) (Thread/сон 5000) (Println а 'Done') (слить {: state (inc (a: state))} ) ' Я хочу, чтобы агент мог отправлять ответ после 5 секунд, но с помощью Thread/sleep - он принимает поток и не разрешает другим агентам использовать потоки. Мне нужно еще один способ отправить действие через некоторое время – Alex

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

0

at функция the at-at library, которая была разработана для поддержки (на мой взгляд фантастической) Явная один синтезатор музыки обеспечивает приятную чистую межфазную для запуска функций в определенный момент времени.

(use 'overtone.at-at) 
(def my-pool (mk-pool)) 
(after 1000 #(println "hello from the past!") my-pool) 
Смежные вопросы