我有一個服務器,我已經實現了NetstringReceiver協議的一個孩子。我希望它根據客戶端的請求執行異步操作(使用txredisapi),然後用操作結果進行響應。我的代碼的推廣:Python twisted:異步操作後寫入連接的服務器?
class MyProtocol(NetstringReceiver):
def stringReceived(self, request):
d = async_function_that_returns_deferred(request)
d.addCallback(self.respond)
# self.sendString(myString)
def respond(self, result_of_async_function):
self.sendString(result_of_async_function)
在上面的代碼,客戶端連接到我的服務器沒有得到迴應。然而,它得到的myString如果我取消
# self.sendString(myString)
我也知道,result_of_async_function是一個非空字符串,因爲我把它打印到標準輸出。
我該怎麼做才能讓我用異步功能的結果來響應客戶端?
更新:可運行的源代碼
from twisted.internet import reactor, defer, protocol
from twisted.protocols.basic import NetstringReceiver
from twisted.internet.task import deferLater
def f():
return "RESPONSE"
class MyProtocol(NetstringReceiver):
def stringReceived(self, _):
d = deferLater(reactor, 5, f)
d.addCallback(self.reply)
# self.sendString(str(f())) # Note that this DOES send the string.
def reply(self, response):
self.sendString(str(response)) # Why does this not send the string and how to fix?
class MyFactory(protocol.ServerFactory):
protocol = MyProtocol
def main():
factory = MyFactory()
from twisted.internet import reactor
port = reactor.listenTCP(8888, factory,)
print 'Serving on %s' % port.getHost()
reactor.run()
if __name__ == "__main__":
main()
不應該有'reactor.callLater(X,d.callback,...)'某處嗎? – 2012-08-13 20:09:38
上面的代碼只是我認爲是相關部分。我有一個使用這個協議的工廠,我打電話給reactor.listenTCP(port,factory,)。 – 2012-08-13 21:18:19
你能否更詳細地填寫這個例子?使其完成並可運行?你在這裏有正確的想法,這意味着問題在於細節,所以爲了回答你的問題,我需要看到具體細節。您可以使用'twisted.internet.task.deferLater'來模擬異步操作以進行演示。 – Glyph 2012-08-13 21:53:46