> 백엔드 개발 > 파이썬 튜토리얼 > Python의 Twisted 프레임워크에서 Deferred 객체 사용에 대한 분석 예

Python의 Twisted 프레임워크에서 Deferred 객체 사용에 대한 분석 예

高洛峰
풀어 주다: 2017-02-03 16:22:53
원래의
1692명이 탐색했습니다.

Deferred 객체 구조
Deferred는 일련의 쌍을 이루는 콜백 체인으로 구성되며, 각 쌍에는 성공 처리를 위한 콜백(콜백)과 오류 처리를 위한 콜백(errbacks)이 포함되어 있습니다. 처음에 deferred는 두 개의 빈 콜백 체인으로 구성됩니다. 콜백을 추가하면 항상 쌍으로 추가됩니다. 비동기 처리 결과가 반환되면 Deferred는 추가된 순서대로 콜백 체인을 시작하고 트리거합니다.
예를 들어 설명하는 것이 더 쉬울 수 있습니다. 먼저 addCallback을 살펴보겠습니다.

from twisted.internet.defer import Deferred
  
def myCallback(result):
  print result
  
d = Deferred()
d.addCallback(myCallback)
d.callback("Triggering callback.")
로그인 후 복사

실행하면 다음과 같은 결과가 나타납니다.

Triggering callback.
로그인 후 복사

위의 예에서는 deferred가 생성되고 해당 addCallback 메서드를 사용하여 성공 처리를 위한 콜백을 등록합니다. d.callback은 지연된 상태로 시작되고 콜백 체인을 호출합니다. 콜백에 전달된 매개변수는 각 콜백 체인의 첫 번째 함수에서도 수신됩니다.
addCallback을 사용하면 다른 잘못된 브랜치가 addErrorback이라고 추측할 수 있습니다. 예를 살펴보겠습니다.

from twisted.internet.defer import Deferred
  
def myErrback(failure):
  print failure
  
d = Deferred()
d.addErrback(myErrback)
d.errback(ValueError("Triggering errback."))
로그인 후 복사

이를 실행하면 다음과 같은 결과가 나타납니다.

[Failure instance: Traceback (failure with no frames): <type &#39;exceptions.ValueError&#39;>: Triggering errback.]
로그인 후 복사

Twisted가 실패 시 오류를 캡슐화하는 것을 볼 수 있습니다.
앞서 언급했듯이 등록된 콜백은 항상 쌍으로 구성된다는 점에 주목할 가치가 있습니다. d.addCallback 및 d.addErrorback 메소드를 사용할 때 콜백이나 오류백을 추가하는 것처럼 보입니다. 실제로 이 수준의 콜백 체인 생성을 완료하기 위해 이러한 메서드는 나머지 절반에 대한 통과도 등록합니다. 콜백 체인의 길이는 항상 동일하다는 점을 기억하세요. 이 콜백 수준의 콜백 및 errback을 각각 지정하려는 경우. d.addCallbacks 메소드를 사용할 수 있습니다:

d = Deferred()
d.addCallbacks(myCallback, myErrback)
d.callback("Triggering callback.")
로그인 후 복사

자... 오늘은 여기서 멈추겠습니다.

고급 예제
다음으로 좀 더 실용적인 작업, 즉 Reactor에 넣어야 합니다. 먼저 예를 살펴보겠습니다.

from twisted.internet import reactor, defer
  
class HeadlineRetriever(object):
  def processHeadline(self, headline):
    if len(headline) > 50:
      self.d.errback(Exception("The headline ``%s&#39;&#39; is too long!" % (headline,)))
    else:
      self.d.callback(headline)
  
  def _toHTML(self, result):
    return "<h1>%s</h1>" % (result,)
  
  def getHeadline(self, input):
    self.d = defer.Deferred()
    reactor.callLater(1, self.processHeadline, input)
    self.d.addCallback(self._toHTML)
    return self.d
  
def printData(result):
  print result
  reactor.stop()
  
def printError(failure):
  print failure
  reactor.stop()
  
h = HeadlineRetriever()
d = h.getHeadline("Breaking News: Twisted Takes us to the Moon!")
d.addCallbacks(printData, printError)
  
reactor.run()
로그인 후 복사

위의 예는 제목을 받아 처리합니다. 제목이 너무 길면 너무 긴 오류가 반환됩니다. HTML로 변환하여 반환했습니다.

주어진 제목이 50자 미만이므로 위 코드를 실행하면 다음과 같은 결과가 반환됩니다.

<h1>Breaking News: Twisted Takes us to the Moon!</h1>
로그인 후 복사

한 가지 주목할 점은 위에서 리액터를 사용했다는 것입니다. 비동기 요청을 시뮬레이션하기 위해 시간 제한 이벤트를 생성하는 데 사용할 수 있는 callLater 메서드.

제목을 매우 길게 만들 경우(예:

h = HeadlineRetriever()
d = h.getHeadline("1234567890"*6)
d.addCallbacks(printData, printError)
로그인 후 복사

예상 결과:

[Failure instance: Traceback (failure with no frames): <type &#39;exceptions.Exception&#39;>: The headline ``123456789012345678901234567890123456789012345678901234567890&#39;&#39; is too long!]
로그인 후 복사

사진을 살펴보겠습니다.) 프로세스:

Deferreds의 핵심 사항
1. Deferreds는 콜백 또는 errback이 호출될 때 트리거됩니다.
2. 여러 번 트리거하려고 하면 EarlyCalledError 예외가 발생합니다.
3. N 수준 콜백 또는 errback의 예외는 errback이 없으면 N+1 수준 errback으로 전달됩니다. 던져진다. N번째 레벨 콜백이나 errback이 Exception을 발생시키지 않거나 Failure 객체를 반환하는 경우 N+1 레벨 콜백에 의해 처리됩니다.
4. 콜백에서 반환된 결과는 다음 레벨 콜백으로 전달됩니다. 첫 번째 매개변수로
5. errback에 전달된 오류가 Failure 객체가 아닌 경우 자동으로 한 번 래핑됩니다.

Python의 Twisted 프레임워크에서 Deferred 객체의 사용을 분석하는 더 많은 예를 보려면 PHP 중국어 웹사이트에서 관련 기사를 확인하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿