2013年02月27日

【Python】Pyro4を使ってサーバーサイドプログラミング

Pyro4を使って、Pythonのサーバーサイドプログラミングを行う。

Pyro4ページ
http://pypi.python.org/pypi/Pyro4

最近の流行りの言葉で言えば、クラウドコンピューティングになるんだろうか。
(ぶっちゃけクラウドの定義がよく分からない。)

また、Pyro4内の各クラスをうまく使いこなせば分散型コンピューティングも可能になるらしい。

インストールの方法


現在 (Pyro4.1.7)対応しているPythonのバージョンはPython2.xと3.x両方。

OSはLinux (ubuntu11.10)とWindows Vistaで確認済み。

Pythonのその他モジュールと同様、解凍ファイル内のsetup.pyのあるディレクトリ内で

$ sudo python setup.py install


を行えばいい。

簡単な使用例


os.nameを利用して、実行システムのOSを返すプログラムを作る。

Windows (クライアント)からPyro4を使ってlinux (サーバ)のos.nameを実行して、Windows上のos.nameでposixを表示させる。


こういうネットワーク関連はセキュリティに大きな気を使わないといけないはず。

ここの使用例ではその辺全く考慮していないし、デフォルトでPyro4がどれだけセキュリティ対策しているのかまだしっかり確認していないので以下URLをあとで読んでおく。

http://pythonhosted.org/Pyro4/security.html

---サーバ側---

まず、linux (サーバ)側に以下のプログラムを書いておく。

サーバーサイドで実行したいプログラム、とPyro4によってサーバのクライアントからのリクエスト状態を作り出すプログラム。


OScheck.py

import Pyro4,os

class OSchecker(object):
def get_info(self):
return os.name

oschecker=OSchecker()

daemon=Pyro4.Daemon("192.168.142.128")
uri=daemon.register(oschecker)

print "Object uri =",uri
daemon.requestLoop()



以下、各パートの説明。


class OSchecker(object):
def get_info(self):
return os.name

oschecker=OSchecker()

os.nameを返すクラスの設計して、oscheckerという名前でインスタンス生成


daemon=Pyro4.Daemon("192.168.142.128")
uri=daemon.register(oschecker)

192.168.142.128 (サーバ側のIPアドレス)を入力してインスタンスoscheckerをデーモンに登録。

uriはクライアントからサーバにデーモンをリクエストする際に必要なコードが入る。


print "Object uri =",uri

そのリクエストの際に必要なコードを確認するためにprintをする。


daemon.requestLoop()

デーモンが常にリクエスト待機状態になるための一行。


サーバ側で以下を実行しておけばサーバがリクエスト待機する。

$ python OScheck.py
/usr/local/lib/python2.6/dist-packages/Pyro4/core.py:155: UserWarning: HMAC_KEY not set, protocol data may not be secure
warnings.warn("HMAC_KEY not set, protocol data may not be secure")
Object uri = PYRO:obj_01286aa85ee044f78b047846a9164de4@192.168.142.128:41252



uri = PYRO:obj_01286aa85ee044f78b047846a9164de4@192.168.142.128:41252

これがこのサーバにリクエストするためのコード。


---クライアント側---

以下はwindows (クライアント)上での作業。

サーバ側をリクエスト待機状態にして、以下を実際に行う。

$ python
>>> uri="PYRO:obj_01286aa85ee044f78b047846a9164de4@192.168.142.128:41252"
>>> alternative=Pyro4.Proxy(uri)
>>> print alternative.get_info()
posix



>>> uri="PYRO:obj_01286aa85ee044f78b047846a9164de4@192.168.142.128:41252"
>>> alternative=Pyro4.Proxy(uri)

alternativeインスタンスはPyro4.Proxy(uri)によってサーバ側のoscheckerクラスのインスタンスとして生成される。

>>> print alternative.get_info()
posix

確かに、windows上でposix (linux)が表示できた。

これで、windows (クライアント)上でリクエストし、linux (サーバ)上で処理され、windows (クライアント)に結果のみ返されたことが確認できた。

雑感


Pyro4の日本語リファレンス欲しい。

サーバとクライアント間のやり取りはpickeモジュールを利用しているらしい。

つまり、Pyroは異なるマシン同士でpickleによってシリアライズ化したオブジェクトのやり取りを行うためのものと考えればいいかもしれない。

単純なサーバーサイドプログラミングならxinetdとpickleモジュールを利用しても同様のことができるはず。

xinetdを利用した場合との速度比較なんかもしてみたい。





この記事へのコメント

name:

mail:

HP:

comment:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/323398562

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。