[PYTHON] Pooling mechanisieren mit Django

Annahme

Erstellen Sie eine WEB-API mit Django (http://www.slideshare.net/satoshiyamada71697/django-54909370) Ich hatte eine gute Zeit.

Problem

Da es sich um eine WEB-API handelt, ist der Zugriff grundsätzlich zustandslos und jedes Mal, wenn eine Mechanisierungsinstanz erstellt und eine Operation ausgeführt wird. Aus Sicht des Intranets war es daher ** eine neue Anmeldung ** für jede Anforderung an die API. In naher Zukunft werde ich wütend auf das Informationssystem sein und mich verbessern wollen.

Bewältigung

Ich habe mich entschieden, zu bündeln, anstatt jedes Mal eine Instanz von mechanize zu erstellen.

Ursprünglicher Anrufer


worker = IntraWorker(USER,PASS)
worker.do_something()

IntraWoker ist eine Klasse, die mechanize verwendet. Ich melde mich jedes Mal mit __init__ an. Ich habe das unten gemacht.

Neuer Anrufer


# get from pool
worker = IntraWorkerPool().get(USER,PASS)
worker.do_something()
# back to pool
worker.close()

Fügen Sie eine Klasse namens IntraWorkerPool hinzu und lassen Sie sie den Pool verwalten.

IntraWorkerPool


from threading import Lock

class IntraWorkerPool(object):
    """
Mechanisieren Sie das Pooling-Management

    """
    #Arbeiter wird gepoolt
    # user,Verwenden Sie den Pass Taple als Schlüssel
    pooled_workers = {}

    def __init__(self):
        self.lock = Lock()
    def get(self, user, password):
        """
Entfernen Sie eine Worker-Instanz aus dem Pool
        """
        ret_aw = None
        pool = IntraWorkerPool.pooled_workers
        key = (hashed(user), password)
        with self.lock:
            if key in pool:
                #Machen Sie, wenn nicht verfügbar
                if len(pool[key]) == 0:
                    pool[key].append(IntraWorker(*key, pool_control=self))
            else:
                pool[key] = []
                pool[key].append(IntraWorker(*key, pool_control=self)
            
            #Überprüfen Sie, ob sich der Mitarbeiter noch anmelden kann
            while (ret_aw is None) or (not ret_aw.is_login()):
                ret_aw = pool[key].pop()

        return ret_aw

    def back_to_pool(self, aw_inst):
        """
Geben Sie die Instanz in den Pool zurück
Das nennt man eigentlich nicht direkt. Rufen Sie mit Close auf der Arbeiterseite an

        """
        key = (hashed(aw_inst.user_no), aw_inst.user_password)
        pool = IntraWorkerPool.pooled_workers
        with self.lock:
            pool.setdefault(key, [])
            pool[key].append(aw_inst)

Wir bereiten ein Wörterbuch mit dem Namen pooled_workers als Klassenvariable vor und verwalten den Taple für Benutzername und Kennwort sowie die Liste der Worker-Instanzen. Da Listenoperationen threadsicher sein sollten, werden sie auch mit threading.Lock () serialisiert. Um zum Pool zurückzukehren, haben wir eine Methode namens `` `back_to_pool``` vorbereitet, die ebenfalls durch Lock geschützt ist. In Wirklichkeit wird back_to_pool jedoch ausgeführt, wenn die Close-Methode auf der Worker-Instanzseite ausgeführt wird.

Um ehrlich zu sein, mag ich die Tatsache nicht, dass die Pool-Management-Klasse und die verwaltete Klasse voneinander abhängig sind, aber ich kann mir keine intelligente Implementierung vorstellen und der Tee ist auf diese Weise schlammig.

Ich würde es begrüßen, wenn mir jemand sagen könnte, ob es etwas Klügeres gibt.

Recommended Posts

Pooling mechanisieren mit Django
Internationalisierung mit Django
Authentifizieren Sie Google mit Django
Django 1.11 wurde mit Python3.6 gestartet
Laden Sie Dateien mit Django hoch
Entwicklungsverdauung mit Django
PDF mit Django ausgeben
Markdown-Ausgabe mit Django
Verwenden Sie Gentelella mit Django
Twitter OAuth mit Django
Mail mit Django senden
Datei-Upload mit Django
Verwenden Sie WENIGER mit Django
Verwenden Sie MySQL mit Django
Django ab heute
Erste Schritte mit Django 2
Fangen Sie mit Django an! ~ Tutorial ⑤ ~
Erstellen Sie eine API mit Django
Mach Django mit CodeStar (Python3.8, Django2.1.15)
Stellen Sie Django serverlos mit Lambda bereit
Python3 + Django ~ Mac ~ mit Apache
Erste Schritte mit Python Django (1)
Erstellen Sie eine Homepage mit Django
Fangen Sie mit Django an! ~ Tutorial ④ ~
Erste Schritte mit Python Django (4)
Erstellen Sie eine Webanwendung mit Django
Erste Schritte mit Python Django (3)
Verwenden Sie Django, um Tweet-Daten zu speichern
Führen Sie eine AES-Verschlüsselung mit DJango durch
Einführung in Python Django (6)
Kombiniere zwei Bilder mit Django
Erste Schritte mit Django mit PyCharm
Echtzeit-Web mit Django-Kanälen
Doppelte Submit-Unterdrückung mit Django
Django REST Framework mit Vue.js
Verwenden Sie prefetch_related bequem mit Django
Erste Schritte mit Python Django (5)
Melden Sie sich mit dem Django Rest Framework an
Qiita API Oauth mit Django
Verbindungspooling mit Python + MySQL
Testgetriebene Entwicklung mit Django Teil 3
Laden Sie die Django-Shell mit ipython neu
Schritte zur Entwicklung von Django mit VSCode
Testgetriebene Entwicklung mit Django Teil 4
Laden Sie ein Django-Modul mit einem Interpreter
Richten Sie mit Django ein soziales Login ein
Testgetriebene Entwicklung mit Django Teil 6
Verwalten Sie Django-Konfigurationsdateien mit Python-Decouple
Stellen Sie die Django-Anwendung mit Docker bereit
Standardisieren Sie HTML, um mit Django gemietet zu werden
Linke äußere Verbindung im Django-Modell
Testgetriebene Entwicklung mit Django Teil 2
Django
Django-Tipps - Erstellen Sie eine Ranking-Site mit Django-
Twitter-Posting-Anwendung mit Django gemacht
Generieren Sie automatisch ein Modellbeziehungsdiagramm mit Django
Führen Sie python3 Django1.9 mit mod_wsgi aus (deploy)
Erstellen Sie eine Webanwendung mit Django
Machen Sie einen Filter mit einer Django-Vorlage
[Django] Verwenden Sie MessagePack mit dem Django REST-Framework
Excel, CSV Import / Export mit Django