Το να ξεκινάς μια διεργασία είναι εύκολο, αλλά η διαχείριση της κατάστασης και της συμπεριφοράς της μπορεί να γίνει πολύ περίπλοκη. Το module Agent είναι μια αφαίρεση που διευκολύνει τη διαχείριση μιας κοινόχρηστης κατάστασης μέσα σε μια διεργασία της Elixir.
Όταν χρησιμοποιείς συναρτήσεις του module Agent, συνηθίζεται να ενθυλακώνεις τις συναρτήσεις που αφορούν τον agent σε ένα μόνο module.
# A simple use of agent processes to represent a counter
defmodule Counter do
def start_link(initial_value) do
Agent.start(fn -> initial_value end)
end
def value(pid) do
Agent.get(pid, & &1)
end
def increment(pid) do
Agent.update(pid, &(&1 + 1))
end
end
Η επιλογή να χρησιμοποιήσεις το module Agent, ή να χρησιμοποιήσεις πολλαπλές διεργασίες γενικότερα, εξαρτάται από τη σχέση που θέλεις να μοντελοποιήσεις με τα δεδομένα. Οι διεργασίες agent είναι χρήσιμες όταν μια κοινόχρηστη κατάσταση πρέπει να χρησιμοποιηθεί από πολλαπλές διεργασίες.
Συχνά είναι καλύτερη επιλογή να αποφύγεις τη χρήση μιας ξεχωριστής διεργασίας και να κρατήσεις την κατάσταση σε μια μεταβλητή μέσα στη συνάρτηση. Πρόσεχε επίσης να μην τις αντιμετωπίζεις άκριτα σαν καθολική μεταβλητή, αφού μπορεί να τροποποιηθούν από άλλες διεργασίες, δημιουργώντας συνθήκες ανταγωνισμού ή λάθη που δεν μπορείς να εντοπίσεις.
Αν επιλέξεις να χρησιμοποιήσεις μια διεργασία agent, ο στόχος σου θα πρέπει να είναι να κρατάς μια απλή κατάσταση, ενθυλακώνοντας τις κλήσεις προς τη διεργασία agent μέσα σε ένα module, ώστε να οργανώνεις τις κλήσεις.
Αν μια δαπανηρή εργασία πρέπει να γίνει σε άλλη διεργασία, θα πρέπει να εξετάσεις μια διεργασία task (χρησιμοποιώντας το Task). Αν κρίνεις ότι μια διεργασία πρέπει να κρατάει κατάσταση και να εκτελεί συμπεριφορές, θα πρέπει να εξετάσεις μια διεργασία GenServer (χρησιμοποιώντας το GenServer).