У меня есть метод, который вызывает асинхронные вызовы с использованием витой и возвращает значение.Мое требование - возвращаться только после завершения всех обратных вызовов.
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.
-Бала