2009-10-29 6 views
24

Clojure API opisano te dwie funkcje, jako:Jaka jest różnica między funkcjami "wyślij" i "wyślij" Clojure w związku z wysyłaniem akcji do agenta?

(wysłać f & args) - wysyłkowe działanie na środek. Natychmiast zwraca agenta. Następnie w wątku z puli wątków, stan agenta zostanie ustawiona na wartość: (zastosować action-fn state-of-agenta args)

i

(wysyłania -off af & args) - Wysłanie potencjalnego działania blokującego do agenta. Natychmiast zwraca agenta. Następnie w osobnym wątku, stan agenta zostanie ustawiona na wartość: (zastosować action-fn state-of-agenta args)

Jedyną oczywistą różnicą jest pożegnanie powinny być używane, gdy akcja może blokować. Czy ktoś może wyjaśnić tę różnicę w funkcjonalności bardziej szczegółowo?

Odpowiedz

23

wszystkie działania, które zostaną wysłane do dowolnego agenta używającego send, są uruchamiane w puli wątków z kilkoma więcej wątkami niż fizyczna liczba procesorów. powoduje to, że zbliżają się do pełnej wydajności procesora. jeśli wykonasz 1000 połączeń za pomocą send, nie będziesz ponosił zbyt dużych kosztów przełączania, połączenia, które nie mogą być natychmiast przetworzone, tylko poczekaj, aż procesor stanie się dostępny. jeśli blokują, to pula wątków może działać na sucho.

Podczas korzystania z send-off dla każdego połączenia tworzony jest nowy wątek. Jeśli masz funkcje send-off 1000, te, które nie mogą być przetworzone od razu, wciąż czekają na następny dostępny procesor, ale mogą ponieść dodatkowy narzut rozpoczęcia wątku, jeśli zdarzyło się, że wątek przesyłania wypadł nisko. Jest ok, jeśli wątki blokują, ponieważ każde zadanie (potencjalnie) dostaje dedykowany wątek.

+14

send-off tak naprawdę nie tworzy nowego wątku, używa innej, rozszerzalnej puli wątków. – pmf

+1

dzięki: będę edytować, aby to uwzględnić. dzięki za wskazanie tego. –

Powiązane problemy