Monday, September 22, 2008

Parallel Computing in Python using PYRO


Image di garuk dari http://schwehr.org/blog/attachments/2007-04/pyro.jpg

Setelah beberapa hari berkecimpung didunia python dan mencari-cari bahan2 di dunia yang tidak nyata a.k.a dunia maya a.k.a internet, ternyata banyak sekali metode-metode maupun library-library yang bisa digunakan untuk parallel computing bisa menggunakan RMI (java technologi), xmlrpc (xml), corba, dan masih banyak lagi (tak usah sebutin semua ntar malah menuh-menuhin postinggan).
Dengan python kita juga bisa menggunakan XMLRPC yang manggunakan metode remote transaksinya menggunakan xml dan sudah ditulis di ilmukomputer oleh mas Noprianto kalo ngga salah judule distributed programming dengan python.

Abis surfing2 dan menghabiskan dua galon kopi, satu ton kacang akhirnya ada juga metode yang mirip dengan RMI, dan corba meskipun jika dibandingkan dengan corba masih kalah tapi klo pake PYRO lebih simple, gampang :D (cari yang gampang ga sabaran jeh..).
Behahahahahaha... bukannya membanding-bandingkan satu sama lain, tapi alangkah baiknya jika satu bahasa pemrograman dengan bahasa pemrograman yang lain saling berintegrasi dan menghasilkan teknologi baru...
Yoo kita bareng-bareng bekerja sama sharing ilmu bikin teknologi baru, Knowledge belong to the world but money belong to my pocket hehehe... just kidding.

Apakah PYRO ?
PYRO adalah kependekan dari PYthon Remote Object. PYRO merupakan sistem teknologi distribusi objek yang powerful, yang didesain mudah untuk digunakan. Tak perlu khawatir tentang pembuatan kode-kode komunikasi jaringan, ketika menggunakan PYRO kita tinggal menulis kode-kode program seperti membuat objek seperti halnya pembuatan program python biasa. Dengan sedikit kode ekstra, PYRO akan menangani komunikasi jaringan antara objek- objek yang terpisah dalam mesin-mesin komputer yang berbeda. Semua detail dari socket programming akan ditangani PYRO, kita tinggal memanggil method pada remote objek sebagaimana kita memanggil local objek.
PYRO terdiri dari bentukan objek oriented RPC (Remote Procedure Call). Kita dapat menggunakan PYRO dengan sistem tunggal tetapi juga digunakan untuk IPC. PYRO menyerupai RMI (Remote Procedure Call) pada Java. PYRO lebih mirip dengan CORBA (Common Object Request Broker Architecture) yang mana sistem dan bahasa teknologi objek distribusi berdiri sendiri dan lebih lengkap jika dibanding PYRO atau RMI. Tetapi PYRO simpel, kecil, fun dan free. Untuk mendapatkan dokumentasi tentang PYRO dan download paket bisa diperoleh dari http://pyro.sourceforge.net/.

PYRO teknologi
1. PYRO protocol didasarkan atas TCP/IP menggunakan pickle
2. Dapat digunakan pada jaringan yang heterogen (LAN. WAN), kluster begitu juga untuk mesin multiprosessor.
3. Server dan client dapat saling bertukar aturan (callback)
4. Penggunaannya seperti python biasa
5. Konfigurasi yang mudah

Prinsip dari PYRO
PYRO menggunakan name server (NS) untuk menemukan remote objek:
- Remote objek harus diregister menggunakan NS
- Client mencari NS remote objek untuk mendapatkan URI remote objek (seperti halnya WWW URL)
Client menggunakan proxy untuk memforward method call ke remote objek. Terdapat tiga jenis proxi:
- Static proxy
- Dinamic proxy dan
- Dinamic proxy dengan atribut akses suport

Contoh simpel :
Contoh dari distribusi yang mendemonstrasikan prinsip dari PYRO.
- tst.py : Remote kode yang akan melakukan komputasi/perhitungan.
- server.py : Server yang mengijinkan mengeksekusi ke tst.py
- client.py : Client yang memanggil method dari tst.py secara remote

# tst.py
# class ini yang akan diakses secara remote.
class testclass:
def mul(s, arg1, arg2): return arg1*arg2
def add(s, arg1, arg2): return arg1+arg2
def sub(s, arg1, arg2): return arg1-arg2
def div(s, arg1, arg2): return arg1/arg2
def error(s):
x=foo()
x.crash()
class foo:
def crash(s):
s.crash2('going down...')
def crash2(s, arg):
# statemen ini sengaja untuk mencoba jika program terjadi kesalahan:
x=arg/2


# server.py
# class yang mengijinkan untuk mengakses tst.py
import Pyro.core
import Pyro.naming
import tst

class testclass(Pyro.core.ObjBase, tst.testclass):
def __init__(self):
Pyro.core.ObjBase.__init__(self)
Pyro.core.initServer()

ns=Pyro.naming.NameServerLocator().getNS()
daemon=Pyro.core.Daemon()
daemon.useNameServer(ns)
uri=daemon.connect(testclass(),"simple")
print "Server is ready."
daemon.requestLoop()


# client.py
import Pyro.util
import Pyro.core
Pyro.core.initClient()
test = Pyro.core.getProxyForURI("PYRONAME://simple")
print test.mul(111,9)
print test.add(100,222)
print test.sub(222,100)
print test.div(2.0,9.0)
print test.mul('.',10)
print test.add('String1','String2')
print '*** invoking server method that crashes ***'
print test.error()


*Note : Dapat dijalankan pada satu komputer secara otomatis akan bounding ke localhost

Menjalankan program dengan cara :
1. Jalankan PYRO name server dahulu pada komputer 1 dengan menjalankan perintah pada console/command prompt "pyro-ns"

amru@icEcubE:~$ pyro-ns
*** Pyro Name Server ***
Pyro Server Initialized. Using Pyro V3.7
URI is: PYRO://169.254.10.233:9090/a9fe0ae9017c2f9e44b865150e28f3da
URI written to: ...\Pyro-3.4\examples\simple\Pyro_NS_URI
Name Server started.


2. Jalankan server pada komputer 2 dengan menjalankan :

amru@icEcubE:~/Documents/distributed$ python server.py
Pyro Client Initialized. Using Pyro V3.7
Pyro Server Initialized. Using Pyro V3.7
Server is ready.


3. Jalankan client pada komputer 3 dengan menjalankan :

amru@icEcubE:~/Documents/distributed$ python client.py
Pyro Client Initialized. Using Pyro V3.7
999
322
122
0.222222222222
..........
String1String2
*** invoking server method that crashes ***
Traceback (most recent call last):
File "client.py", line 12, in
print test.error()
File "/usr/lib/python2.5/site-packages/Pyro/core.py", line 390, in __call__
return self.__send(self.__name, args, kwargs)
File "/usr/lib/python2.5/site-packages/Pyro/core.py", line 468, in _invokePYRO
return self.adapter.remoteInvocation(name, constants.RIF_VarargsAndKeywords, vargs, kargs)
File "/usr/lib/python2.5/site-packages/Pyro/protocol.py", line 491, in remoteInvocation
answer.raiseEx()
File "/usr/lib/python2.5/site-packages/Pyro/errors.py", line 81, in raiseEx
raise self.excObj
TypeError: ("unsupported operand type(s) for /: 'str' and 'int'", 'This error occured remotely (Pyro). Remote traceback is available.')

4 comments:

  1. Python denger dah lama, cm blm pernh nyoba"
    Nah si PYRO ini barang baru hhihihih :)

    ReplyDelete
  2. baru sign nih. alo ru...lama tak jumpa.mkin cnggih aja skrng

    ReplyDelete
  3. @imam
    ngga baru2 amat tapi masih garansi :)

    @ekoyudhi
    halah biasa aja ko... jadi malu.. :)

    ReplyDelete
  4. @imam
    python ga lama juga, lamaan Java,,..python buatan orang jerman, kalo mo tau hasil dari python sekarang liat Facebook ama Google App,....
    eh kalo mo python yang dari dot net juga ada lho,.. pake iron python lebih cepet dari python biasa untuk saat ini. GUInya juga bagus karna didukung ama Microsoft hehehhehe,......tinggal click drag

    ReplyDelete