Download Introduction to Programming - Rensselaer Polytechnic Institute

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Distributed Computing with
Python
Carlos Varela
Rensselaer Polytechnic Institute
C. Varela, RPI
1
Distributed Computing with
Python
• Using standard TCP/IP (or UDP) sockets
• Using high-level libraries for remote method invocation
– XML-RPC
– Pyro (PYthon Remote Objects)
C. Varela, RPI
2
Networking with Python Sockets
•
•
•
•
•
Resembles C socket API
Can use UDP (datagrams) or TCP (streamed connections)
Does not require “non-standard” libraries
Low-level, yet relatively easy to use and portable
Enables more efficient communication and is
programming language independent.
• New features require protocol extensions
C. Varela, RPI
3
Sockets: An Echo Server
from socket import *
def main():
s = socket(AF_INET, SOCK_STREAM)
s.bind((‘’, 50007)) # port number
s.listen(1)
conn, (remotehost, remoteport) = s.accept()
print 'connected by', remotehost, remoteport
while 1:
data = conn.recv(1024) # buffer size
if not data: break
conn.send(data)
conn.close()
main()
C. Varela, RPI
4
Sockets: An Echo Client
from socket import *
def main():
s = socket(AF_INET, SOCK_STREAM)
s.connect((‘localhost’, 50007)) # port number
s.send(‘Hello World’)
data = s.recv(1024) # buffer size
s.close()
print data
main()
C. Varela, RPI
5
Remote Procedure Calls with
Python XML-RPC library
• XML-RPC is programming-language/O.S. independent
• Uses XML as message format for parameters and return
values, e.g.:
<params>
<param>
<value><string>Hello World</string></value>
</param>
</params>
• Uses HTTP as the transport protocol.
• Enabling technology for building “web services”.
• Example requires downloading xmlrpcserver.py library:
http://svn.python.org/view/python/trunk/Demo/xmlrpc/
C. Varela, RPI
6
XML-RPC: An Echo Server
import SocketServer; import xmlrpcserver; import xmlrpclib
class EchoReqHandler(xmlrpcserver.RequestHandler):
def call(self, method, params):
print "Dispatching: ", method, params
try:
server_method = getattr(self, method)
except:
raise AttributeError, ”No method: %s" % method
return server_method(params)
def echo(self, value):
return xmlrpclib.dumps(value)
server = SocketServer.TCPServer(('', 8000), EchoReqHandler)
7
server.serve_forever() C. Varela, RPI
XML-RPC: An Echo Client
import xmlrpclib
echosvr = xmlrpclib.Server("http://localhost:8000")
print echosvr.echo("Hello World")
print echosvr.echo(10)
C. Varela, RPI
8
Distributed Computing with
Python Remote Objects (PYRO)
• Resembles Java RMI: Server Daemon, Client Proxy
• To find remote objects:
– By name, e.g., “PYRONAME://echo”, requires name server
– By location, e.g., “PYROLOC://localhost:7766/echo”
– By URI, e.g.,
“PYRO://127.0.0.1:7766/7f0000010512127841288b1892e90a71”
• Method arguments, return values, and exceptions
marshalled (“pickled”) over the network
• Example code requires downloading and installing Pyro at:
http://pyro.sourceforge.net/
C. Varela, RPI
9
Pyro: An Echo Server
import Pyro.core
class Echo(Pyro.core.ObjBase):
def __init__(self):
Pyro.core.ObjBase.__init__(self)
def echo(self, string):
return string;
Pyro.core.initServer()
daemon=Pyro.core.Daemon()
uri=daemon.connect(Echo(),"echo-object")
print "The object's uri is:",uri
daemon.requestLoop()
C. Varela, RPI
10
Pyro: An Echo Client
import Pyro.core
echoProxy = Pyro.core.getProxyForURI(
"PYROLOC://localhost:7766/echo-object")
print echoProxy.echo("Hello World")
C. Varela, RPI
11
Python Remote Objects (PYRO)
• Python programming language-dependent
• Event server for publish-subscribe communication
• Mobile code, but BEWARE: No security
guarantees!
C. Varela, RPI
12
Exercises
1. Compare the round trip time of the Echo application using:
•
•
•
TCP/IP
XML-RPC
Pyro
2. Use the XML-RPC client in Python to connect to an
existing web service (e.g., Google)
•
http://www.xmlrpc.com/googleGateway
3. Modify the echo example in Pyro to use the name service.
What are alternative ways to get to the name server?
4. Does Pyro support distributed garbage collection?
C. Varela, RPI
13