Twisted deferred에 두 개의 개별 콜백을 연결하여 결과가 준비된 후 둘 다 실행되도록 하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com//questions/24051762

  •  21-12-2019
  •  | 
  •  

문제

저는 Twisted에 대한 경험이 많지 않지만, 지금까지 제가 이해한 내용은 다음과 같습니다.
다음과 같은 데이터베이스 쿼리를 수행할 때:

db = database.veryLongQuery(sql, binds)

결과에 대해 작업을 수행하기 위해 콜백을 추가할 수 있습니다.

db.addCallback(lambda res: dispalyResult(res))

그렇지 않고 동일한 결과를 얻기 위해 여러 작업을 수행해야 하는 경우 다음과 같은 메서드를 만들 수 있습니다.

def doTwoThings(self, res):
    self.d1 = anotherDeferred(res) # write to table A, return lastRowId
    self.d2 = yetAnotherDeferred(res) # write to table B, return lastRowId
    return d1

그리고 그걸 첨부해 db (첫 번째 콜백으로)

db.addCallback(self.doTwoThings)

하지만 참고하고 싶습니다. d1 그리고 d2 처음부터 db가 생성되는 동시에 다른 이벤트가 발생하고 콜백을 추가해야 하기 때문에 d1 그리고 d2.

두 개 이상의 별도 콜백 체인을 동일한 지연된 콜백 체인에 연결하려면 어떻게 해야 합니까? db, 그래서 '분할'되고 결과가 준비되면 둘 다 나란히 발사됩니까?

이렇게 하면 처음부터 연기된 각 항목을 추적하고 필요에 따라 액세스할 수 있습니다.

아니면 만드는 방법이 있나요? d1 그리고 d2 처음부터 그 이름에 액세스할 수 있나요?

도움이 되었습니까?

해결책

다음과 같은 것을 사용할 수 있습니다:

def splitResults(d1, d2):
    def splitter(val):
        # Pass val to d2 chain
        d2.callback(val)
        # Return val into d1's chain
        return val

    def splitterError(err):
        d2.errback(err)
    d1.addCallbacks(splitter, splitterError)

따라서 d1이 결과를 얻을 때마다 d2에도 전달됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top