Περιορισμένες ουρές εργασίας και χειρισμός υπερφόρτωσης — DedSec Project
Περιορισμένες ουρές εργασίας και χειρισμός υπερφόρτωσης Μηχανισμός και συμβόλαιο Μια απεριόριστη ουρά μετατρέπει την υπερφόρτωση σε αυξανόμενη μνήμη και παρωχημένη εργασία. Ένα όριο απαιτεί…
Μηχανισμός και συμβόλαιο
Μια απεριόριστη ουρά μετατρέπει την υπερφόρτωση σε αυξανόμενη μνήμη και παρωχημένη εργασία. Ένα όριο απαιτεί ρητή απόφαση όταν οι παραγωγοί είναι ταχύτεροι: σύντομη αναμονή, απόρριψη, αντικατάσταση ανανεώσιμης εργασίας ή μεταφορά σε μόνιμη αποθήκευση. Η σημασία του στοιχείου καθορίζει την πολιτική. Η απόρριψη παλιάς ανανέωσης οθόνης διαφέρει από απώλεια αγοράς.
Το μήκος ουράς δεν είναι βαθμός παραλληλισμού. Εκατό αποθηκευμένα στοιχεία με τέσσερις workers σημαίνουν τέσσερις ταυτόχρονες λειτουργίες. Περιόρισε και το μέγεθος κάθε στοιχείου, επειδή δέκα τεράστια αντικείμενα παραμένουν υπερβολικά. Η μη μπλοκαρισμένη εισαγωγή κάνει την υπερφόρτωση ορατή. Σε ταυτόχρονο κώδικα το qsize είναι στιγμιότυπο διάγνωσης, όχι αξιόπιστη άδεια για put ή get· χειρίσου το αποτέλεσμα της πράξης.
Τοπικό παράδειγμα
from queue import Queue, Full
q = Queue(maxsize=2)
q.put_nowait("first")
q.put_nowait("second")
try:
q.put_nowait("third")
except Full:
rejected = True
else:
rejected = False
assert rejected
assert q.get_nowait() == "first"
q.task_done()
print("overload observed")
Έλεγχοι αποτυχίας και όρια
Μέτρησε χωριστά αποδεκτά, απορριφθέντα, ολοκληρωμένα στοιχεία και ηλικία παλαιότερου. Κάθε επιτυχές get χρειάζεται task_done ακόμη και σε αποτυχία, αλλιώς το join περιμένει επ’ αόριστον. Δοκίμασε τερματισμό με γεμάτη ουρά και αποτυχία καταναλωτή. Ο worker πρέπει να αναφέρει την αποτυχία στον ιδιοκτήτη του ώστε οι παραγωγοί να μη μείνουν μπλοκαρισμένοι.