Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in zwei Implementierungsmethoden von Python Singleton (mit Code)

Einführung in zwei Implementierungsmethoden von Python Singleton (mit Code)

不言
不言nach vorne
2018-10-12 15:37:002042Durchsuche

Dieser Artikel bietet Ihnen eine Einführung in zwei Implementierungsmethoden von Python-Singletons (mit Code). Ich hoffe, dass er Ihnen als Referenz dienen wird.

In den letzten zwei Tagen habe ich mir den Code angesehen, den ich zuvor geschrieben habe, also habe ich nur die Dinge aussortiert, die ich verwendet habe. Der Singleton-Modus wird häufig in der täglichen Codearbeit verwendet,

Hier finden Sie eine Zusammenfassung der Singleton-Methoden, die zuvor auf unterschiedliche Weise implementiert wurden

Die Decorator-Methode

Diese Methode wird auch häufig in der Arbeit verwendet . Es ist auch bequemer zu verwenden. Der Code ist wie folgt implementiert:

def Singleton(cls):
    _instance = {}
    def _singleton(*args, **kwargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kwargs)
        return _instance[cls]

    return _singleton

Mir persönlich gefällt diese Methode sehr gut

Klasse erreicht

Hier gibt es tatsächlich einige Probleme, auf die Sie achten müssen. Schauen Sie sich zunächst die möglichen Fehlercodes an

@Singleton
class A(object):    
def __init__(self, x):
     self.x = x

Auf den ersten Blick scheint diese Klasse einen Singleton implementiert zu haben, aber hier liegt ein potenzielles Problem vor, das heißt, wenn es sich um eine Multithread-Situation handelt, führt das Schreiben auf diese Weise zu Problemen, insbesondere wenn dies der Fall ist sind einige zeitaufwändige Vorgänge im Initialisierungsobjekt der aktuellen Klasse

Zum Beispiel der folgende Code:

class Member(object):
    @classmethod
    def instance(cls, *args, **kwargs):
        if not hasattr(Member, "_instance"):
            Member._instance = Member(*args, **kwargs)
        return Member._instance

Das Ausführungsergebnis von Dieser Code besteht darin, dass mehrere Objekte instanziiert werden, wodurch der von Ihnen geschriebene Singleton keine Wirkung hat

Natürlich denken wir natürlich darüber nach, ihn durch Sperren zu sperren und zu steuern, also ändern wir den obigen Code:

#! /usr/bin/env python3
# .-*- coding:utf-8 .-*-
import time
import threading
import random
class Member(object):
    def __init__(self):
        time.sleep(random.randint(1,3))
    @classmethod
    def instance(cls, *args, **kwargs):
        if not hasattr(Member, "_instance"):
            Member._instance = Member(*args, **kwargs)
        return Member._instance
def task(arg):
    obj = Member.instance()
    print(obj)
for i in range(5):
    t = threading.Thread(target=task, args=[i,])
    t.start()

Aber es gibt noch ein anderes Problem mit dem obigen Code, nämlich, dass wir nach der Instanziierung jedes Mal, wenn wir die Instanz aufrufen, die Sperre anfordern. Dies ist also der Fall Nicht gut, also ändern wir diesen Teil des Codes erneut:

#! /usr/bin/env python3
# .-*- coding:utf-8 .-*-
import time
import threading
import random
class Member(object):
    _instance_lock = threading.Lock()
    def __init__(self):
        i = random.randint(1, 3)
        print(i)
        time.sleep(i)
    @classmethod
    def instance(cls, *args, **kwargs):
        with Member._instance_lock:
            if not hasattr(Member, "_instance"):
                Member._instance = Member(*args, **kwargs)
        return Member._instance
def task():
    obj = Member.instance()
    print(obj)

for i in range(5):
    threading.Thread(target=task,).start()

Dies ist eine gute Implementierung. Eine einzelne Instanz, die in mehreren Threads verwendet werden kann

Das Obige ist Weitere spannende Inhalte zu Python finden Sie in den Rubriken

Python-Video-Tutorials

und

Python auf der chinesischen PHP-Website. ! !

Das obige ist der detaillierte Inhalt vonEinführung in zwei Implementierungsmethoden von Python Singleton (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen