Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 30226|Απάντηση: 1

[.NET Πυρήνας] Λεπτομερής επεξήγηση του Object Pool στο .NET Core

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 2020-4-15 17:38:34 | | | |
Το 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





Προηγούμενος:Εισαγωγή στις Βελτιώσεις Υπηρεσιών Ιστού (WSE) 3.0
Επόμενος:Πώς βρίσκει το Visual Studio 2013 περιεχόμενο που αντικαθιστά πολλές γραμμές;
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 2023-8-30 18:34:07 |
Το DefaultObjectPool χρησιμοποιείται στο υποκείμενο επίπεδοΤαυτόχρονη ουράΥλοποίηση ουράς ασφαλείας νήματος, ο πηγαίος κώδικας έχει ως εξής:


Η σύνδεση με υπερσύνδεσμο είναι ορατή.


Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com