threadの動作の違うよ。

Python でスレッドまわりを勉強してて、未解決メモ。

3つのスレッドが、それぞれ0から9まで数え上げるって言う、 簡単なものなのですが、 こんな感じで実装すると、 シェルから叩いた時には全部数え上げる前に終了してしまう。

#!/usr/bin/env python2.5
# vim: encoding=utf-8 :

import time
import thread

def run():
    for i in range(10):
        print i
        time.sleep(1)

def main():
    for i in range(3):
        thread.start_new_thread(run, ())
        time.sleep(1)

if __name__ == '__main__':
    main()

でも、この実装だとちゃんと数え上げられた数字が全て表示される。

#!/usr/bin/env python2.5
# vim: encoding=utf-8 :

import time
from threading import Thread

class CountThread(Thread):
    def run(self):
        for i in range(10):
            print i
            time.sleep(1)

def main():
    for i in range(3):
        CountThread().start()
        time.sleep(1)

if __name__ == '__main__':
    main()

この挙動の違いはどうなってるんだろう?

本当に途中で終わっているのかテストしてみようと、 数え上げている数字をファイルに書き出してみると、 上の方だと、 Bus error とかエラー吐いて終了する。 どうやら、ホントに途中で終わってるっぽい。

threading.Thread の方が高水準なインターフェイスらしいので、 何か知らない処理が挟まっているんだろうと推測。 まだまだ勉強が必要ですな。

ちなみに、 threading.Thread のコンストラクタに target を渡すやり方で起動しても、 run をオーバライドした時と同じ動作をしてくれた。 ので、今のところは後者を使っていきたいと思います。

Posted at: 
2008/01/06 23:00:56
0 Comments
1 TrackBack
Tags: 
Python
Thread
Trackback: 
http://humming.via-kitchen.com/2008/01/06/2-threads-have-different-motion/trackback/

TrackBacks

[Python][Mercurial]巡回 - 常山日記

Pylons始めの一歩 [mac][PC]作り方が悪いだけなんだろうか [pylons]今日のpylonsメモ [Python][Python入門記]4.さぁPythonを書こう!(in Eclipse Europa) [コンピュータ] Mercurial [python]フォーマット文字列のフィールド幅 Adapter pattern Exercise #2-2Comments [OpenS

Created at: 
2008/01/07 12:04:31

Comments

まだ登録されていません。

Add Comment

Add Comment