Το Microsoft.Extensions.ObjectPool είναι μέρος της υποδομής ASP.NET Core που υποστηρίζει τη διατήρηση ενός συνόλου αντικειμένων στη μνήμη για επαναχρησιμοποίηση αντί να επιτρέπει τη συλλογή απορριμμάτων αντικειμένων. Εάν τα αντικείμενα που θέλετε να διαχειριστείτε είναι, ίσως χρειαστεί να χρησιμοποιήσετε χώρους συγκέντρωσης αντικειμένων:
- Η κατανομή/αρχικοποίηση είναι δαπανηρή.
- Αντιπροσωπεύει κάποιον περιορισμένο πόρο.
- Χρησιμοποιήστε προβλέψιμα και συχνά.
Η επαναχρησιμοποίηση είναι ένα σημαντικό θέμα και ένα αναπόφευκτο πρόβλημα που συναντάμε συχνά στην καθημερινή μας ανάπτυξη.
Για να πάρουμε το απλούστερο και πιο οικείο παράδειγμα, οι χώροι συγκέντρωσης συνδέσεων βάσεων δεδομένων είναι επαναχρησιμοποιημένες συνδέσεις βάσεων δεδομένων.
Ποιο είναι λοιπόν το νόημα της επαναχρησιμοποίησης;
Με απλά λόγια, μειώνει την περιττή απώλεια πόρων.
Εκτός από τις συνδέσεις βάσεων δεδομένων, μπορεί να υπάρχουν πολλά άλλα αντικείμενα που πρέπει να επαναχρησιμοποιηθούν σε διαφορετικά σενάρια ή απαιτήσεις, και υπάρχει το λεγόμενο Object Pool.
Θα πρέπει να έχετε εφαρμόσει παρόμοιες λειτουργίες μόνοι σας, είτε με το ConcurrentBag, είτε με το ConcurrentQueue, είτε με άλλες λύσεις.
Αυτό μοιράζεται επίσης μια υλοποίηση στην τεκμηρίωση της Microsoft
Διαδικασία: Δημιουργία χώρου συγκέντρωσης αντικειμένων με χρήση ConcurrentBag
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Φυσικά, στο .NET Core, η Microsoft μας βοήθησε να εφαρμόσουμε ένα απλό Object Pool.
Αρχικά, δημιουργήστε ένα νέο έργο κονσόλας .NET Core και χρησιμοποιήστε την εντολή nuget για να προσθέσετε το ακόλουθο πακέτο:
Όλος ο κώδικας έχει ως εξής:
Χρήση 1
Πριν δημιουργήσουμε μια πισίνα, πρέπει να ορίσουμε μια Πολιτική. Εδώ χρησιμοποιούμε απευθείας το συμπεριλαμβανόμενο DefaultPooledObjectPolicy για να το κατασκευάσουμε.
Η ομάδα αντικειμένων θα έχει έναν μέγιστο αριθμό νημάτων που διατηρούνται.
Χρησιμοποιήστε τη μέθοδο Get του αντικειμένου χώρου συγκέντρωσης για να αφαιρέσετε ένα αντικείμενο από το χώρο συγκέντρωσης αντικειμένων.
Ο παραπάνω κώδικας εκτελεί το αποτέλεσμα
#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1/1/0001 12:00:00 πμ #2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-1/1/0001 12:00:00 πμ #3-de717815-796a-4349-a571-047acc125104-itsvse.com-1/1/0001 12:00:00 πμ #4-3a404341-a560-47f7-a3b0-0d477a8ae17f-itsvse.com-1/1/0001 12:00:00 πμ #5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-1/1/0001 12:00:00 πμ #6-7ea4d596-fd2a-43b3-959a-9e48da58a758-itsvse.com-1/1/0001 12:00:00 πμ #7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-1/1/0001 12:00:00 πμ #8-ca767674-2c07-4f26-975f-4711a31d795d-itsvse.com-1/1/0001 12:00:00 πμ #9-a9cd1859-a919-46a0-ae5d-85b6d3d11ccb-itsvse.com-1/1/0001 12:00:00 πμ #10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-1/1/0001 12:00:00 πμ Αυτό το αποτέλεσμα δείχνει ότι τα αντικείμενα στο Object Pool ανανεώνονται απευθείας και ορισμένες ιδιότητες δεν υποτιμώνται, κάτι που συχνά δεν έχει πολύ πρακτικό νόημα αυτή τη στιγμή.
Επειδή το DefaultPooledObjectPolicy είναι ένα νέο αντικείμενο άμεσα, πολλές φορές, αυτό δεν είναι αυτό που περιμένουμε!
Εάν θέλετε να ανταποκριθείτε στην πραγματική μας χρήση, πρέπει να ορίσετε μόνοι σας μια πολιτική!
Ας ρίξουμε μια ματιά στη χρήση 2
Χρήση 2
Η μέθοδος Create χρησιμοποιείται για τη δημιουργία του αντικειμένου Demo και η μέθοδος Return είναι η απόρριψη του αντικειμένου Demo πίσω στο Object Pool (δανεισμένο και επιστρεφόμενο).
Η ομάδα αντικειμένων ορίζεται εδώ για να περιέχει μόνο ένα αντικείμενο.
Δεδομένου ότι υπάρχει μια λειτουργία επιστροφής ενός βήματος μετά την αφαίρεσή της από τη δεξαμενή αντικειμένων, το στοιχείο1 και το στοιχείο2 θα πρέπει να είναι το ίδιο αντικείμενο.
Αφού αφαιρέσετε το στοιχείο 2 από την ομάδα αντικειμένων, δεν επιστρέφεται, επομένως η ομάδα αντικειμένων θα δημιουργήσει ένα νέο αντικείμενο με βάση την πολιτική που ορίσαμε.
Εδώ είναι το αποτέλεσμα εξόδου της χρήσης 2:
15/985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-4/2020 3:31:15 πμ 15/985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-4/2020 3:31:15 πμ
True 15/8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-4/2020 3:31:15 πμ
False Μπορείτε να δείτε ότι οι μεμονωμένες ιδιότητες του αντικειμένου 1, του αντικειμένου 2 και του αντικειμένου 3 είναι οι ίδιες και το στοιχείο 1 και το στοιχείο 2 είναι πράγματι το ίδιο αντικείμενο. Το στοιχείο 3 και το στοιχείο 1 δεν είναι το ίδιο πράγμα.
Χρήση 3
Μπορείτε να δείτε ότι το στοιχείο1 και το στοιχείο2 είναι το ίδιο αντικείμενο. Κατά τη λήψη ενός αντικειμένου από το Object Pool, θα ληφθεί το πρώτο, οπότε αν το επιστρέψετε και το ανακτήσετε ξανά, θα λάβετε πρώτα το πρωτότυπο.
Το item3 λαμβάνεται απευθείας από το Object Pool εκεί και δεν δημιουργείται ξανά, επειδή το Object Pool εδώ διατηρεί πολλά αντικείμενα, όχι μόνο ένα στη χρήση 2, επομένως λαμβάνεται απευθείας από το Pool.
Εδώ είναι το αποτέλεσμα εξόδου
15/f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-4/2020 3:33:58 πμ 15/f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-4/2020 3:33:58 πμ
True 15/b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-4/2020 3:33:58 πμ
False Όπως και η χρήση 2, η ουσία είναι η ίδια.
Χρήση 4
Φαίνεται ότι η παραπάνω χρήση δεν μοιάζει τόσο με την κανονική μας χρήση. Πρέπει ακόμα να βασιστούμε στην ένεση.
Ας δούμε λοιπόν επιτέλους πώς να συνδυάσουμε την ένεση εξάρτησης. Φυσικά, η ουσία εδώ εξακολουθεί να είναι αδιαχώριστη από τα δύο πράγματα του Ασφαλιστηρίου και του Παρόχου.
Πρέπει πρώτα να καταχωρήσουμε τον πάροχο και, στη συνέχεια, να πάρουμε απευθείας την παρουσία του για να δημιουργήσουμε μια ομάδα αντικειμένων.
Εάν θέλετε να το χρησιμοποιήσετε αλλού, μπορείτε να το εγχύσετε μέσω του κατασκευαστή.
Το αποτέλεσμα εδώ είναι επίσης το ίδιο με πριν, δεν υπάρχουν πολλά να πούμε.
περίληψη
Αλλά ανεξάρτητα από το είδος της χρήσης, πρέπει να καταλάβουμε ότι το Object Pool είναι αδιαχώριστο από τους τρεις τύπους του Pool, του Policy και του Provider.
Με αυτά τα τρία, ίσως μπορούμε να κάνουμε ό,τι θέλουμε.
Φυσικά, προσφέρει και αρκετά ιδιαίτερα πράγματα που μπορείτε να δείτε αν σας ενδιαφέρει.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|