ふー疲れた・・・・なんなんだこの本は。 ちなみにウチの実行環境はPython2.5。これが原因か?そんなこともないだろう。もっと根本的。
今日ハマったのはThreadのサンプルコード
#!/usr/bin/env python # -*- coding: utf-8 -*- #以下のURLからコピー #http://coreblog.org/ats/stuff/minpy_support/samplecodes/threadedhttpserver.py/view from BaseHTTPServer import * from SimpleHTTPServer import * from threading import Thread class ThreadedHTTPServer(Thread): def __init__(self, port=8080, **kwargs): """ Thread対応サーバオブジェクトの初期化 """ self.httpd = HTTPServer(("",port), SimpleHTTPRequestHandler) self.httpd_running = False Thread.__init__(self) def run(self): """ スレッドのコードを実行 """ self.httpd_running = True while self.httpd_running: self.httpd.handle_request() del self.httpd def stop(self): """ スレッドの実行を停止するためフラグを立てる """ self.httpd_running = False
これを実行する、すると、どうだ?
スレッドが終了しないんだな。
>>> s = ThreadedHTTPServer() >>> s.start() >>> s.stop() >>> s.start() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python\lib\threading.py", line 428, in start assert not self.__started, "thread already started" AssertionError: thread already started >>>s.stop() >>>s.isAlive() True >>>
スレッドを破棄してから、再度スレッドをRun出来ない。つまりSTOP()関数がまるで動作していない。isAlive()で調べてやると、True。つまりスレッドは終了されてない。
なんで?バグ?それとも、バージョン違い?スレッド破棄されてない。スレッドの紹介になってない。こまるよ。3000円もするんだから。しっかりしてよ。正誤表にもあがってねぇ。
昨日は、Sqliteのサンプルコードが文字コードの処理不十分でエラー。
つーか、ここまで動かないんだと、正直金返せと(言い過ぎ〜)
サンプルコードが動かないんだと、入門書ととしていかがなモノか。Pythonの最新版(2.4以上)をインストールしましょうとかかずに、Python2.4をインストールする必要がありますとか書いてる方が良いんじゃない?
追記)
みんなのPythonをよく読み直してみると、スレッドの終了処理は適当です〜みたいなことが書いてあった、なるほど、俺が突っ込んだのが馬鹿だったわけだ。
まぁスレッドって高度だからごめんね、入門書だからってことか。それでも、きっちりスレッドの終了処理は書いておくべきかと思うよ。補注なり、脚注をつかって。Appendixでもいいし。いい加減とはっきり書いちゃうのは、どうなんだろう。