tornado.IOLoopのシングルトン実装

非同期ネットワークフレームワークの tornado では I/O イベントループ(IOLoop)を用意し、イベントドリブンに処理する。基本的に、1 プロセス 1 イベントループのため、各操作はグローバルに同じインスタンスをあつかうように、IOLoop はシングルトンパターンで実装されている。

どういうふうに実装されているか、確認してみた。

実装

tornado/ioloop.py の IOLoop クラスは、次のような感じになっている

class IOLoop(object):
    @staticmethod
    def instance():
        if not hasattr(IOLoop, "_instance"):
            IOLoop._instance = IOLoop()
        return IOLoop._instance

    @staticmethod
    def initialized():
        return hasattr(IOLoop, "_instance")

IOLoop クラスのコンストラクターにシングルトンのロジックは含めず、インスタンスを返すスタティックメソッドを用意し、このメソッド経由でインスタンス化するように設計している。
スタティックメソッドなので、IOLoop クラスのインスタンスを作成せずにこのメソッドを呼ぶことができる。
シングルトン対象のクラスがインスタンス化済みかどうかは、クラス変数 _instance を利用し、グローバルなインスタンスもがあるかチェックし、なければ IOLoop クラスをインスタンス化してこの変数に代入している。

一番エレガントな実装ではないかもしれないが、コードを見ただけでやりたいことがすぐにわかるので、読む側としては助かる。

こういう API 設計のため、サンプルコードも

io_loop = ioloop.IOLoop.instance()
io_loop.start()

ioloop.IOLoop.instance().stop()

というようにスタティックメソッド IOLoop.instance でインスタンスを取得して操作している。

他の実装例

Python でのいろいろなシングルトン実装例は次の URL にある

StackOverflow : Creating a singleton in python
http://stackoverflow.com/questions/6760685/creating-a-singleton-in-python

Tornado ではシングルトンクラスが IOLoop しか無いため、クラス内でベタに実装されているのだと思う。
フレームワークとしてシングルトンクラスが複数有るような場合は、StackOverflow の #3 にあるようにメタクラスを用意し、クラスをシングルトン化するとスッキリする。

# Method 3: A metaclass
# http://stackoverflow.com/questions/6760685/creating-a-singleton-in-python
class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

class MyClass(BaseClass):
    __metaclass__ = Singleton
Advertisements
Tagged with:
Posted in python

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 4 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 5 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 5 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 10 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: