Вы хотите, чтобы getHash
вернул Deferred
, а не синхронное значение.
Способ сделать это - создать Deferred
и связать его с соединением, которое выполняет определенный запрос.
Следующее не проверено и, вероятно, не будет работать, но оно должно дать вам приблизительное представление:
import simplejson
from twisted.python.protocol import ClientFactory
from twisted.internet.defer import Deferred
from twisted.internet import reactor
from twisted.protocols.basic import LineReceiver
class BufferingJSONRequest(LineReceiver):
buf = ''
def connectionMade(self):
self.sendLine(simplejson.dumps(self.factory.params))
def dataReceived(self, data):
self.buf += data
def connectionLost(self, reason):
deferred = self.factory.deferred
try:
result = simplejson.load(self.buf)
except:
deferred.errback()
else:
deferred.callback(result)
class BufferingRequestFactory(ClientFactory):
protocol = BufferingJSONRequest
def __init__(self, params, deferred):
self.params = params
self.deferred = deferred
def clientConnectionFailed(self, connector, reason):
self.deferred.errback(reason)
def getHash(params):
result = Deferred()
reactor.connectUNIX(LOCATION_THASHER,
BufferingRequestFactory(params, result))
return result
Теперь, чтобы использовать эту функцию, вам уже нужно быть знакомым с Deferreds, и вам нужно будет написать функцию обратного вызова, которая будет запускаться, когда в конечном итоге придет результат. Но объяснение тому принадлежит отдельному вопросу;).