eventletでEchoServer
2008-12-22 - ⧖ 1.0 minnon-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 ()