>  기사  >  백엔드 개발  >  Python의 싱글톤 패턴 소개

Python의 싱글톤 패턴 소개

PHPz
PHPz원래의
2017-04-02 13:26:481198검색

버스는 컴퓨터의 다양한 기능 구성 요소나 장치 간에 데이터, 제어 신호 및 기타 정보를 전송하기 위한 공용 통신 솔루션 중 하나입니다. 이제 다음 시나리오를 가정해 보겠습니다. 중앙 처리 장치(CPU)가 특정 프로토콜 버스를 통해 세마포어에 연결되어 있습니다. 세마포어에는 설정할 수 있는 64가지 색상이 있으며, 모두 세마포어를 제어할 수 있습니다. , 이 신호등의 색상은 독립적으로 설정할 수 있습니다. 프로토콜 세부 사항(인쇄로 표시됨)과 신호에 대한 스레드 제어 논리를 구현하는 방법 등을 추상화합니다.
제어를 위해 스레드 잠금을 추가하는 것이 가장 먼저 떠오르는 방법이지만, 각 스레드별로 잠금을 제어하면 모듈 간의 결합이 증가한다는 것은 의심의 여지가 없습니다. 다음으로 이 문제를 해결하기 위해 디자인 패턴에서 Single Case 패턴을 활용해 보겠습니다.
싱글턴 패턴이란 무엇인가요? 싱글톤 패턴은 클래스에 인스턴스가 하나만 있는지 확인하고 이에 액세스할 수 있는 전역 액세스 지점을 제공한다는 의미입니다. 특히 이 예에서 버스 개체 는 인스턴스가 하나만 있는 싱글톤입니다. 각 스레드에는 버스에 대한 전역 액세스 지점이 하나만 있습니다. 즉, 유일한 인스턴스입니다.
Python코드는 다음과 같습니다.

#encoding=utf8import threading
import time#这里使用方法new来实现单例模式class Singleton(object):#抽象单例
    def new(cls, *args, **kw):        if not hasattr(cls, '_instance'):
            orig = super(Singleton, cls)
            cls._instance = orig.new(cls, *args, **kw)        return cls._instance#总线class Bus(Singleton):
    lock = threading.RLock()    def sendData(self,data):        self.lock.acquire()
        time.sleep(3)
        print "Sending Signal Data...",data        self.lock.release()#线程对象,为更加说明单例的含义,这里将Bus对象实例化写在了run里class VisitEntity(threading.Thread):
    my_bus=""
    name=""
    def getName(self):        return self.name    def setName(self, name):        self.name=name    def run(self):        self.my_bus=Bus()        self.my_bus.sendData(self.name)if  name=="main":    for i in range(3):
        print "Entity %d begin to run..."%i
        my_entity=VisitEntity()
        my_entity.setName("Entity_"+str(i))
        my_entity.start()

실행 결과는 다음과 같습니다.
엔티티 0이 실행되기 시작합니다...
엔티티 1이 실행되기 시작합니다. ..
Entity 2가 실행되기 시작합니다...
신호 데이터를 보내는 중... Entity_0
신호 데이터를 보내는 중... Entity_1
신호 데이터를 보내는 중... Entity_2
실행 중 프로그램, 세 개의 스레드가 동시에 실행되고(실행 결과의 처음 세 줄이 빠르게 인쇄됨) 그런 다음 버스 리소스가 각각 점유됩니다(마지막 세 줄이 3초마다 인쇄됨). 버스가 세 번 인스턴스화되는 것처럼 보이지만 실제로는 메모리에 인스턴스가 하나만 있습니다.

단일 케이스 패턴

단일 케이스 패턴은 모든 디자인 패턴 중 비교적 간단한 유형으로 정의는 다음과 같습니다. 클래스에 인스턴스가 하나만 있는지 확인하고 전역 지점을 제공합니다. (특정 클래스가 전역적으로 단 하나의 인스턴스와 단 하나의 액세스 포인트를 갖도록 보장)

싱글턴 모드의 장점 및 적용

싱글턴 모드의 장점:
1. 싱글톤 모드로 인해 예시 모드에서는 전역적으로 하나의 인스턴스만 필요하므로 많은 메모리 공간을 절약할 수 있습니다.
2. 전역적으로 액세스 포인트가 하나만 있으므로 데이터 동기화를 더 잘 제어하고 다중 점유를 피할 수 있습니다.
3. 단일 예제를 메모리에 저장하여 시스템 오버헤드를 줄일 수 있습니다.
싱글턴 모드의 적용 예:
1. 전역적으로 고유한 일련 번호를 생성합니다.
2. 디스크, 버스 등 전역적으로 재사용되는 고유 리소스에 액세스합니다.
3. 데이터베이스 등의 리소스가 너무 많습니다.
4. Windows의 작업 관리자와 같은 시스템의 전역 통합 관리
5.

싱글턴 패턴의 단점

1. 싱글턴 패턴의 확장이 상대적으로 어렵습니다.
2. 싱글턴 패턴을 위반하는 경우가 많습니다. 범위. 책임 원칙(6가지 원칙은 나중에 논의됨)
3. 동시 협업 소프트웨어 모듈에서 가장 먼저 완료해야 하는 작업이므로 테스트에 도움이 되지 않습니다.
4. 싱글톤 모드는 특정 상황에서 사용됩니다. 이로 인해 "리소스 병목 현상"이 발생합니다.

위 내용은 Python의 싱글톤 패턴 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.