マルチスレッドで

  1 # thread test
  2 # encoding: utf-8
  3 import thread
  4 import time
  5 n = 0
  6 
  7 def func():
  8         global n
  9         while 1:
 10                 n += 1
 11                 if n > 100:
 12                         break
 13                 print "call func", n
 14 #               time.sleep(0.05)
 15 
 16 def main():
 17         while 1:
 18                 if n > 100:
 19                         break
 20                 print "call main", n
 21 #               time.sleep(0.05)
 22 
 23 thread.start_new_thread(func,())
 24 main()

実行するとターミナルではこのように表示される。

call main 0
call main 0
call main 0
call func 1
call func 2
call func 3

これだとmainの後にfuncを処理してるかのように見える。
実際はマルチスレッドとして動作しているが、なんか誤解しそう。
14と21行目でtime.sleepを行ったら思惑通りに表示された。

call main 0
call func 1
call main 1
call func 2
call main 2

原因はなんだろう。ターミナルの問題ならいいのだが。

そういえば

これって確か正常な動作のはず。wait()でレンダリング走らせるとか常識だったような。

注意

import thread, threading
import time
n = 0

def func():
	global n
	while 1:
		n += 1
		if n > 100:
			break
		print "call func", n
		time.sleep(0.01)

thread.start_new_thread(func,())
#time.sleep(1)
print "end"

この場合print "end"でメインスレッドが終了してしまう。
上の例では24行目でmain()を実行しているので問題ないが、気持ち悪いのでthreading.Threadを使う。

  1 # thread test
  2 # encoding: utf-8
  3 import threading
  4 import time
  5 n = 0
  6 
  7 def func():
  8         global n
  9         while 1:
 10                 n += 1
 11                 if n > 100:
 12                         break
 13                 print "call func", n
 14                 time.sleep(0.01)
 15 
 16 def main():
 17         global n
 18         while 1:
 19                 if n > 100:
 20                         break
 21                 print "call mann", n
 22                 time.sleep(0.01)
 23 
 24 t_func = threading.Thread(target=func, args=())
 25 t_main = threading.Thread(target=main, args=())
 26 t_func.start()
 27 t_main.start()
 28 t_func.join()
 29 t_main.join()
 30 
 31 print "end", n

スレッドが終了するのを待ってから最後のprint "end", nが実行される。