From cd9bc46ebd1ad5336cf27f517db8eb43e1947410 Mon Sep 17 00:00:00 2001 From: Roger Meier Date: Mon, 3 Jan 2011 20:19:07 +0000 Subject: [PATCH] THRIFT-1024 Add Python Twisted example to the Tutorial Patch: Michael git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1054733 13f79535-47bb-0310-9956-ffa450edef68 --- tutorial/py.twisted/PythonClient.py | 76 +++++++++++++++++++++++ tutorial/py.twisted/PythonServer.py | 92 ++++++++++++++++++++++++++++ tutorial/py.twisted/PythonServer.tac | 48 +++++++++++++++ 3 files changed, 216 insertions(+) create mode 100755 tutorial/py.twisted/PythonClient.py create mode 100755 tutorial/py.twisted/PythonServer.py create mode 100755 tutorial/py.twisted/PythonServer.tac diff --git a/tutorial/py.twisted/PythonClient.py b/tutorial/py.twisted/PythonClient.py new file mode 100755 index 00000000..27a3d534 --- /dev/null +++ b/tutorial/py.twisted/PythonClient.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python + +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +import sys +sys.path.append('../gen-py') + +from tutorial import Calculator +from tutorial.ttypes import * + +from twisted.internet.defer import inlineCallbacks +from twisted.internet import reactor +from twisted.internet.protocol import ClientCreator + +from thrift import Thrift +from thrift.transport import TTwisted +from thrift.protocol import TBinaryProtocol + +@inlineCallbacks +def main(client): + yield client.ping() + print 'ping()' + + sum = yield client.add(1,1) + print '1+1=%d' % (sum) + + work = Work() + + work.op = Operation.DIVIDE + work.num1 = 1 + work.num2 = 0 + + try: + quotient = yield client.calculate(1, work) + print 'Whoa? You know how to divide by zero?' + except InvalidOperation, io: + print 'InvalidOperation: %r' % io + + work.op = Operation.SUBTRACT + work.num1 = 15 + work.num2 = 10 + + diff = yield client.calculate(1, work) + print '15-10=%d' % (diff) + + log = yield client.getStruct(1) + print 'Check log: %s' % (log.value) + reactor.stop() + +if __name__ == '__main__': + d = ClientCreator(reactor, + TTwisted.ThriftClientProtocol, + Calculator.Client, + TBinaryProtocol.TBinaryProtocolFactory(), + ).connectTCP("127.0.0.1", 9090) + d.addCallback(lambda conn: conn.client) + d.addCallback(main) + + reactor.run() diff --git a/tutorial/py.twisted/PythonServer.py b/tutorial/py.twisted/PythonServer.py new file mode 100755 index 00000000..6130b92d --- /dev/null +++ b/tutorial/py.twisted/PythonServer.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python + +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +import sys +sys.path.append('../gen-py.twisted') + +from tutorial import Calculator +from tutorial.ttypes import * + +from shared.ttypes import SharedStruct + +from zope.interface import implements +from twisted.internet import reactor + +from thrift.transport import TTwisted +from thrift.protocol import TBinaryProtocol +from thrift.server import TServer + +class CalculatorHandler: + implements(Calculator.Iface) + def __init__(self): + self.log = {} + + def ping(self): + print 'ping()' + + def add(self, n1, n2): + print 'add(%d,%d)' % (n1, n2) + return n1+n2 + + def calculate(self, logid, work): + print 'calculate(%d, %r)' % (logid, work) + + if work.op == Operation.ADD: + val = work.num1 + work.num2 + elif work.op == Operation.SUBTRACT: + val = work.num1 - work.num2 + elif work.op == Operation.MULTIPLY: + val = work.num1 * work.num2 + elif work.op == Operation.DIVIDE: + if work.num2 == 0: + x = InvalidOperation() + x.what = work.op + x.why = 'Cannot divide by 0' + raise x + val = work.num1 / work.num2 + else: + x = InvalidOperation() + x.what = work.op + x.why = 'Invalid operation' + raise x + + log = SharedStruct() + log.key = logid + log.value = '%d' % (val) + self.log[logid] = log + + return val + + def getStruct(self, key): + print 'getStruct(%d)' % (key) + return self.log[key] + + def zip(self): + print 'zip()' + +if __name__ == '__main__': + handler = CalculatorHandler() + processor = Calculator.Processor(handler) + pfactory = TBinaryProtocol.TBinaryProtocolFactory() + server = reactor.listenTCP(9090, + TTwisted.ThriftServerFactory(processor, + pfactory), interface="127.0.0.1") + reactor.run() diff --git a/tutorial/py.twisted/PythonServer.tac b/tutorial/py.twisted/PythonServer.tac new file mode 100755 index 00000000..11f0f8fd --- /dev/null +++ b/tutorial/py.twisted/PythonServer.tac @@ -0,0 +1,48 @@ +#!/usr/bin/env python + +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from twisted.application import internet, service +from thrift.transport import TTwisted + +import sys +sys.path.append('../gen-py.twisted') +from tutorial import Calculator +from tutorial.ttypes import * +from PythonServer import CalculatorHandler + +def make_application(): + application = service.Application('CalcServer') + + handler = CalculatorHandler() + processor = Calculator.Processor(handler) + + serverFactory = TTwisted.ThriftServerFactory(processor, + TBinaryProtocol.TBinaryProtocolFactory()) + + calcService = internet.TCPServer(9090, serverFactory) + + multiService = service.MultiService() + calcService.setServiceParent(multiService) + multiService.setServiceParent(application) + + return application + +application = make_application() -- 2.17.1