それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

みんなのPythonのサンプルコードは動かない。

ふー疲れた・・・・なんなんだこの本は。 ちなみにウチの実行環境は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でもいいし。いい加減とはっきり書いちゃうのは、どうなんだろう。