Κοινή χρήση μιας δεξαμενής διακομιστών μεσολάβησης μεταξύ νημάτων Python με ουρά
Χρησιμοποιήστε μια συγχρονισμένη ουρά και ένα μπλοκ finally για να κρατήσετε έναν διακομιστή μεσολάβησης για μια σύγχρονη νηματική λειτουργία και να τον επιστρέψετε μετά.
Όταν πολλά νήματα μοιράζονται μια μικρή δεξαμενή διακομιστών μεσολάβησης, η επιλογή μιας τυχαίας καταχώρισης μπορεί να δώσει τον ίδιο διακομιστή σε δύο ενεργές λειτουργίες. Μια ουρά μπορεί να κρατά τις καταχωρίσεις που είναι διαθέσιμες για δανεισμό:
from contextlib import contextmanager
from queue import Queue
available = Queue()
for endpoint in dict.fromkeys(proxy_urls):
available.put(endpoint)
@contextmanager
def borrow_proxy():
endpoint = available.get(timeout=5)
try:
yield endpoint
finally:
available.put(endpoint)
def process_url(url):
with borrow_proxy() as endpoint:
return fetch_one(url, endpoint)
Κατασκευάστε την ουρά μία φορά, πριν ξεκινήσουν τα νήματα εργασίας. Το proxy_urls περιέχει πλήρεις διευθύνσεις URL τελικών σημείων. Δημόσιοι υποψήφιοι είναι διαθέσιμοι στη λίστα δωρεάν διακομιστών μεσολάβησης· χρησιμοποιήστε το πρωτόκολλο και τη μορφή URL που υποστηρίζει η fetch_one. Η υπάρχουσα σύγχρονη συνάρτηση fetch_one πρέπει να ολοκληρώσει τη δικτυακή της λειτουργία και να κλείσει οποιαδήποτε απόκριση πριν επιστρέψει. Διαφορετικά, ο δανεισμός θα τελείωνε ενώ η σύνδεση εξακολουθεί να χρησιμοποιεί αυτόν τον διακομιστή.
Η Queue.get αφαιρεί ατομικά μία διαθέσιμη καταχώριση. Μια εξαντλημένη δεξαμενή περιμένει αντί να σαρώνει επανειλημμένα κοινές σημαίες. Αν δεν φτάσει καμία καταχώριση μέσα σε πέντε δευτερόλεπτα, το queue.Empty φτάνει στον καλούντα· επιλέξτε την πολιτική επανάληψης, αποτυχίας ή ακύρωσης της εφαρμογής για αυτό το αποτέλεσμα.
Το μπλοκ finally επιστρέφει μια καταχώριση που αποκτήθηκε μετά από επιτυχία ή εξαίρεση. Δεν δηλώνει ότι ένα αποτυχημένο τελικό σημείο είναι υγιές. Οι πολιτικές καραντίνας, αντικατάστασης και ψύξης χρειάζονται ρητή διαδρομή αντί να απορρίπτουν σιωπηλά κάθε διακομιστή που βλέπει προσωρινό σφάλμα.
Η αφαίρεση διπλότυπων πανομοιότυπων συμβολοσειρών URL αποτρέπει διπλές καταχωρίσεις στην ουρά. Διαφορετικά URL μπορεί ακόμη να αναφέρονται στον ίδιο φυσικό διακομιστή ή έξοδο· ομαδοποιήστε τα σκόπιμα αν η αποκλειστικότητα πρέπει να ισχύει για αυτόν τον κοινό πόρο. Η ουρά συντονίζει νήματα σε αυτή τη διεργασία, όχι εργάτες σε άλλα μηχανήματα.