Twistedでハマった件について(ProtocolクラスとFactoryクラス)

| | Comments (0) | TrackBacks (0)
HDEラボの桜井です。
昨日とは打って変わって、渋谷は天気いいっす。
こんなときはゆっくりと散歩でもして、新製品のアイデアでも練りたいところですが...。

今日はちょっとしたメモ。
前回Twistedについて書いたときに(これ)、echo.tacというサンプルを載せたと思います。
実行順序としては、下記のようになります。

・Factoryクラスのインスタンスを生成する

・Protocolクラスのサブクラスのインスタンスを生成する

・デーモンとして常駐

じゃあ、Protocolクラスの初期化は一回だけなのか?
っていうことが疑問に思ったわけです。

では、下記のプログラムで確認してみましょう。

echo.tac
 
from twisted.internet.protocol import Protocol,Factory
from twisted.application import service,internet

class Echo(Protocol):
  def __init__(self):
    print "INIT"

  def dataReceived(self, data):
    self.transport.write(data)
    self.transport.loseConnection()
 
factory = Factory()
factory.protocol = Echo
 
myServer = internet.TCPServer(2345, factory)
application = service.Application('Echo')
myServer.setServiceParent(application)
 

プログラムを動作させるためには、下記のように実行してデーモン化します。
 
$ twistd -oy echo.tac

さらに下記のようにTelnetで接続すると、普通にEchoサーバとなります。
これを何度か接続を切りながらやってみます。
 
$ telnet localhost 2345
helo
helo
Connection closed by foreign host.


同じディレクトリにあるtwistd.logを見ると、接続をするたびに "INIT"という文字列が出力されているのがわかると思います。
 
2008-11-13 14:24:31+0900 [-] Log opened.
2008-11-13 14:24:31+0900 [-] twistd 8.1.0 (/usr/bin/python 2.4.3) starting up
2008-11-13 14:24:31+0900 [-] reactor class: 
2008-11-13 14:24:31+0900 [-] twisted.internet.protocol.Factory starting on 2345
2008-11-13 14:24:31+0900 [-] Starting factory 
2008-11-13 14:24:35+0900 [twisted.internet.protocol.Factory] INIT
2008-11-13 14:24:46+0900 [twisted.internet.protocol.Factory] INIT
2008-11-13 14:24:50+0900 [twisted.internet.protocol.Factory] INIT


これらのことから、リクエストのたびにProtocolクラスのサブクラスのインスタンスが生成されていることがわかります。
無論、Factoryクラスのインスタンス生成は一度だけでした。

まあ、どこでデータを初期化したり保持したりすれば良いか、参考になればいいなという、ただのメモでした。

0 TrackBacks

Listed below are links to blogs that reference this entry: Twistedでハマった件について(ProtocolクラスとFactoryクラス).

TrackBack URL for this entry: http://lab.hde.co.jp/blog/mt-tb.cgi/69

Leave a comment

About this Entry

This page contains a single entry by Takeshi SAKURAI published on November 13, 2008 2:03 PM.

Pythonで顔認識プログラム(OpenCV) was the previous entry in this blog.

SQLAlchemyのセッションを学ぶ(セッション作成編) is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.