Quelle est la différence entre les fonctions "send" et "send-off" de Clojure en ce qui concerne l'envoi d'une action à un agent?

L'API Clojure décrit ces deux fonctions comme suit:

(envoyer un f & args) - envoie une action à un agent. Retourne immédiatement le mandataire. Par la suite, dans un thread d'un pool de threads, l'état de l'agent sera défini sur la valeur: (apply action - FN state-of-agent args)

Et

(send-off a f & args) - envoie une action potentiellement bloquante à un agent. Retourne immédiatement le mandataire. Par la suite, dans un fil séparé, l'état de l' l'agent sera défini à la valeur de: (apply action - FN State-of-agent args)

La seule différence évidente est send-off doit être utilisé lorsqu'une action peut bloquer. Quelqu'un peut-il expliquer cette différence de fonctionnalité plus en détail?

24
demandé sur Robert Campbell 2009-10-29 23:31:32

1 réponses

Toutes les actions envoyées à un agent utilisant send sont exécutées dans un pool de threads avec quelques threads de plus que le nombre physique de processeurs. cela les amène à s'exécuter plus près de la pleine capacité du processeur. si vous effectuez 1000 appels en utilisant send, Vous n'encourez pas vraiment beaucoup de frais généraux de commutation, les appels qui ne peuvent pas être traités immédiatement attendent simplement qu'un processeur soit disponible. s'ils bloquent, le pool de threads peut fonctionner à sec.

Lorsque vous utilisez send-off, un nouveau thread est créée pour chaque appel. si vous send-off 1000 fonctions, celles qui ne peuvent pas être traitées immédiatement attendent toujours le prochain processeur disponible, mais elles peuvent entraîner des frais supplémentaires de démarrage d'un thread si le pool de threadssend-off est faible. {[5] }c'est ok si les threads bloquent car chaque tâche (potentiellement) obtient un thread dédié.

24
répondu Arthur Ulfeldt 2015-06-29 20:44:28