Twited ждать, пока все обратные вызовы не будут сделаны - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть метод, который вызывает асинхронные вызовы с использованием витой и возвращает значение.Мое требование - возвращаться только после завершения всех обратных вызовов.

from twisted.web import client
from twisted.internet import reactor, ssl
from OpenSSL import SSL
from twisted.web.http_headers import Headers
from twisted.internet import reactor
from twisted.web.client import Agent, readBody
import traceback

class sslPolicyForAgent(client.BrowserLikePolicyForHTTPS):
    def creatorForNetloc(self, hostname, port):
        return ssl.optionsForClientTLS(
            hostname.decode("ascii"),
            trustRoot=self._trustRoot
        )

class ReadData(object):
    def __init__(self, cred_data, security_resource_list):
        try:
            self.creds = cred_data
            self.securitycenter_list = security_resource_list
            self.callbackstack = list()
        except Exception as e:
            traceback.print_exc()

    def deferred_rest_api_call(self, url, num):
        try:
            agent = Agent(reactor, contextFactory=sslPolicyForAgent())
            deferred = agent.request(b'GET',url)
            return deferred
        except Exception as e:
            traceback.print_exc()

    def successCallback(self, result, num):
        print('Processing callback')
        print(result)

    def errorCallback(self, err):
        print('Error')

    def getDiscoveryResultListData(self):
        for num in range(0,2):
            self.url = 'https://www.google.com/'
            deferred = self.deferred_rest_api_call(self.url, num)
            deferred.addCallback(self.successCallback, num)
            deferred.addErrback(self.errorCallback)
        return 'Finished processing'

if __name__ == '__main__':
    data = dict()
    data['url'] = 'DemoLB'
    readDataObj = ReadData(data, list())
    value_ret = readDataObj.getDiscoveryResultListData()
    print(value_ret)
    reactor.run()

но, как и ожидалось, поскольку вызов асинхронный, обратные вызовы выполняются после возврата из метода.Какой будет способ получить результаты / блок, пока не будут выполнены обратные вызовы.

Я работаю с Python 2.7.

-Бала

...