Cache Decorator, XML-RPC Server und Client

Stand: März 2008

irgendein Text

Syntax:

Seitenanfang

XML RPC Server - server.py


   import socket
   from SocketServer import TCPServer 
   from SimpleXMLRPCServer import SimpleXMLRPCServer as Server
   
   from cashdeco import Factorial as F, PrimeNumbers as P
   
   class Handler(F, P):
       pass
   
   ip = socket.gethostbyname(socket.gethostname())
   
   TCPServer.allow_reuse_address = True
   serv = Server((ip,1337))
   serv.register_instance(Handler())
   
   print "XMLRPC - Server Adresse: http://%s:1337." % str(ip)
   print 'Zum Beenden Strg+Pause benutzen.'
   
   serv.serve_forever()

Kategorie: Python

Seitenanfang

Modul Cache Decorator


   from math import sqrt
   
   class Cache(object):
       def __init__(self):
           self.cache = {}
           self.function = None
      
       def function_cached(self, *args):
           if args not in self.cache:
               self.cache[args] = self.function(*args)
               if args[1] == True: # Den Cache im Prompt des Servers anzeigen.
                   print 'neu berechnet '+str(args)+' -> id'+str(id(self.cache[args]))
               else:
                   print 'neu berechnet '
           else:
               if args[1] == True: # Den Cache im Prompt des Servers anzeigen.
                   print 'aus dem Cache '+str(args)+' -> id'+str(id(self.cache[args]))                 
                   for key in self.cache:
                       if key == args:
                           print key
                           print self.cache[key]
                           break
               else:
                   print 'aus dem Cache '
   
           # Den errechneten Wert an den Client zurückgeben.
           if args[2] == True:
               # Hier als String
               # - Beachten: lange Rückgabezeit bei 'großen' Zahlen
               # - Vorteil: Unabhängigkeit von der benutzten Programmiersprache des Clients.
               for key in self.cache:
                   if key == args:
                       result = str(self.cache[key])
                       break
               ## Alternativ als Binary 64Bit
               ## result = xmlrpclib.Binary(self.cache[key])
               ## mit Attribut .data wieder entpacken.
               return result
           else:
               # Hier nur Rückgabe von [n]
               # Es soll nur die benötigte Rechenzeit ermittelt werden.
               return args 
       
       def __call__(self, function):
           self.function = function
           return self.function_cached
       
   class Factorial(object):
       def __init__(self):
           pass
   
       @Cache()
       def fac(n, cache, result):
           n = abs(n)
           p = 1
           for i in xrange(2, n+1):
               p *= i        
           return p
   
   class PrimeNumbers(object):
       def __init__(self):
           pass
       
       @staticmethod
       def determine_prime(to_limit):               
           numbers = dict([[i,True] for i in xrange(2, to_limit)])
           for n in xrange(2, to_limit):            
               if numbers[n]:
                   yield n
                   if n <= sqrt(to_limit):
                       for key in numbers.iterkeys():
                           if not key % n:
                               numbers[key] = False
   
       @Cache()
       def call_determine_prime(to_limit, cache, result):
           liste = [prime for prime in PrimeNumbers.determine_prime(to_limit)]
           if result == True:
               print liste
           return liste

Kategorie: Python

Seitenanfang

XML-RPC-Client - client.py, cmd.Cmd Konsole


   import cmd
   import time
   import xmlrpclib
   
   class Console(cmd.Cmd):
       def __init__(self, serv):
           cmd.Cmd.__init__(self)
           self.prompt = '>>> '
           self.serv = serv
           self.cache = False
           self.result = False
   
       def do_cache(self, arg):
           result = raw_input('>>> Den internen Cache im Prompt des Servers anzeigen? (j|n): ')
           result = result.strip().lower()
           if result == 'j':
               print '>>> Aufbau des Cache wird angezeigt.'
               self.cache = True
           elif result == 'n':
               print '>>> Keine Cacheanzeige.'
               self.cache = False
           return False
       
       def help_cache(self):
           print '>>> Den Inhalt des internen Caches im Prompt des Servers anzeigen.'
           print '>>> Vorsicht bei grossen Zahlen, grosse Wartezeiten^^'
   
       def do_result(self, arg):
           result = raw_input('>>> Ergebnis an den Aufrufer? (j|n): ')
           result = result.strip().lower()
           if result == 'j':
               print '>>> Ergebnisse werden zurueckgegeben.'
               self.result = True
           elif result == 'n':
               print '>>> Keine Ergebnisrueckgabe.'
               self.result = False
           return False
       
       def help_result(self):
           print '>>> Ergebnisrueckgabe an den Aufrufer.'
           print '>>> Vorsicht bei grossen Zahlen, grosse Wartezeiten^^'
   
       def do_factorial(self, arg):
           try:
               n = int(raw_input('>>> Wir benoetigen eine Zahl: '))
               start = time.clock()            
               self.serv.fac(n, self.cache, self.result)
               print ">>> Faktorielle der Zahl %d ermittelt." % n
               print ">>> Total: %1.4f Sekunden: " % (time.clock() - start)
           except ValueError, OverflowError:
               print '>>> Es wird eine Zahl benoetigt!'
           finally:
               return False
           
       def help_factorial(self):
           print '>>> Die Faktorielle einer Zahl ermitteln.'
                            
       def do_prime(self, arg):
           try:
               to_limit = int(raw_input('>>> Eine Obergrenze festlegen: '))
               start = time.clock()
               self.serv.call_determine_prime(to_limit, self.cache, self.result)
               print ">>> Alle Primzahlen bis zu der vorgegebenen Grenze %d ermitteln." % to_limit
               print ">>> Total: %1.4f Sekunden: " % (time.clock() - start)
           except ValueError:
               print '>>> Eine Obergrenze muss festgelegt werden!'
           finally:
               return False
                                      
       def help_prime(self):
           print '>>> Alle Primzahlen bis zu einer vorgegebenen Obergrenze ermitteln'
   
       def do_exit(self, arg):
           print '>>> und Exit...'
           return True
                           
       def help_exit(self):
           print '>>> Beendet die Console.'
   
   def main():    
       ip = raw_input('>>> Eingabe IP des Servers: ')    
       serv=xmlrpclib.ServerProxy("http://%s:1337" % ip)
   
       console = Console(serv)
       console.onecmd(console.precmd('help'))
       console.cmdloop()
   
   if __name__ == '__main__':
       main()

Kategorie: Python

Seitenanfang