suzuzusu日記

(´・ω・`)

Pykkaでping pong

Pythonでactor model使いたかったので忘備録として

Pykka

Pythonのactor model frameworkです.

インストール方法

pip install pykka

Actorの実装方法

標準のThreadによる実装やgeventなどがある. ドキュメントに gevent の方が一般的に Thread よりも早いことが記載されている.

gevent実装のActorを使用する場合,geventのインストール方法

pip install gevent

通信方法

ask は同期通信,tell は非同期通信となっている. ask の場合は返り値を受け取れるが,tell の場合は None が返り値となる.

ping pong

pingというメッセージに対してpongを返すサンプルを書いてみる.

以下は threading.Thread の実装

from pykka import ThreadingActor

class Actor(ThreadingActor):
    def __init__(self):
        super().__init__()

    def on_receive(self, message):
        print('recieve:', message)
        return 'pong'

actor = Actor.start()
r = actor.tell('ping') # None
print('tell:', r)
r = actor.ask('ping') # pong
print('ask:', r)
actor.stop()

'''
tell: None
recieve: ping
recieve: ping
ask: pong
'''

以下は gevent の実装

from pykka.gevent import GeventActor
class Gactor(GeventActor):
    def __init__(self):
        super().__init__()

    def on_receive(self, message):
        print('recieve:', message)
        return 'pong'

gactor = Gactor.start()
r = gactor.tell('ping')
print('tell:', r)
r = gactor.ask('ping')
print('ask:', r)
gactor.stop()

'''
tell: None
recieve: ping
recieve: ping
ask: pong
'''

参考