eventletでEchoServer
Posted on Mon, 22 Dec 2008 17:15:18 +0900
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()