clojure agents

¿Cuál es la diferencia entre las funciones de "envío" y "envío" de Clojure con respecto al envío de una acción a un agente?



agents (1)

todas las acciones que se envían a cualquier agente mediante el send se ejecutan en un grupo de subprocesos con un par de subprocesos más que el número físico de procesadores. esto hace que se ejecuten más cerca de la capacidad total de los cpu. Si realiza 1000 llamadas usando el send , realmente no incurrirá en una gran sobrecarga de conmutación, las llamadas que no pueden procesarse inmediatamente solo esperan hasta que un procesador esté disponible. si se bloquean, el conjunto de hilos puede funcionar en seco.

cuando se utiliza el send-off , se crea un nuevo hilo para cada llamada. Si send-off 1000 funciones, las que no se pueden procesar inmediatamente esperan al próximo procesador disponible, pero pueden incurrir en la sobrecarga adicional de iniciar un subproceso si la agrupación de subprocesos de envío se está agotando. está bien si los subprocesos se bloquean porque cada tarea (potencialmente) obtiene un subproceso dedicado.

La API de Clojure describe estas dos funciones como:

(enviar af & args) - Enviar una acción a un agente. Devuelve el agente inmediatamente. Posteriormente, en un subproceso de un grupo de subprocesos, el estado del agente se establecerá en el valor de: (aplicar args de estado de agente de acción-fn)

y

(Send-off af & args): envía una acción de posible bloqueo a un agente. Devuelve el agente inmediatamente. Posteriormente, en un subproceso independiente, el estado del agente se establecerá en el valor de: (aplicar argumentos de estado de agente de acción-fn)

La única diferencia obvia es que el envío debe usarse cuando una acción puede bloquearse. ¿Alguien puede explicar esta diferencia en funcionalidad con mayor detalle?