マルチスレッドで
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が実行される。