pingpong

erlangの軽量プロセスの説明に良く使われているpingpongの例をPython threadingで書いてみる。

# -*- encoding:utf-8 -*-

"""
"""
from threading import Thread
from Queue import Queue

def ping(times, queue):
    """
    """
    for i in xrange(times):
        print "send ping, %d" % i
        queue.put(("ping", i))
    queue.put(("finish", None))
        
def pong(queue):
    while True:
        (msg, arg) = queue.get()
        if msg == "ping":
            print "received:%d" % arg
        if msg == "finish":
            print "finshed"
            return
       
if __name__ == '__main__':
    q = Queue()
    pingTh = Thread(target=ping, args=(10, q))
    pongTh = Thread(target=pong, args=(q,))
    pongTh.start()
    pingTh.start()
    

メッセージングには同期化キューを使っている。
2.5からはジェネレータにsendできるようになったので、マイクロスレッドで作ることもできそうだ。