eventletでEchoServer

non-blocking IOを手軽に楽しめるPythonモジュール eventletでEcho Serverを書いてみる。のさわりの部分。 インストールにちょっと手間取ったのでメモ。

$ sudo easy_install eventlet

結果的には上記でいいのですが、ppcではクライアントからsendしたところ? でSIGSEGVで落ちました。

gdb でおってみると greenlet が落ちてるところまでは わかりましたが、手がカジカンデイタので解析をあきらめる。 (単なる言い訳ですが。。。)

$ gdb python
(gdb) r evlet_echosv.py
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x30011b70 (LWP 3914)]
0x0e70a4d0 in call___do_global_ctors_aux ()
   from /home/hattori/.python-eggs/greenlet-0.1-py2.6-linux-ppc.egg-tmp/greenlet.so
(gdb) bt
#0  0x0e70a4d0 in call___do_global_ctors_aux ()
   from /home/hattori/.python-eggs/greenlet-0.1-py2.6-linux-ppc.egg-tmp/greenlet.so
#1  0x100acb4c in PyEval_CallObjectWithKeywords (func=0x303ee4a0, arg=0x10199b54, kw=0xe722edc)
    at Python/ceval.c:3548

#19 0x10010c7c in Py_Main (argc=805881040, argv=<value optimized out>) at Modules/main.c:597
#20 0x1000fd70 in main (argc=<value optimized out>, argv=<value optimized out>) at ./Modules/python.c:23
(gdb)

メジャーなOS/CPUなら大丈夫かなと思いUbuntuで試してみた。

$ sudo apt-get install python-dev
$ sudo easy_install eventlet

結果Ubuntuだと正常に動作しました。EchoServerの例は Eventletのページ のまんまです。

from eventlet import api

def handle_socket(client):
    fp = client.makefile()
    while True:
        x = fp.readline()
        if not x:
            break
        fp.write(x)
        print "recieve:", x

if __name__ == '__main__':
    server = api.tcp_listener(('0.0.0.0', 7777))
    while True:
        new_sock, address = server.accept()
        api.spawn(handle_socket, new_sock)
    server.close()