Python のスレッドと os.system について

os.system は、サブプロセスの実行が終わるまでブロックする。& をつけるとブロックしない。

Python のスレッドは、daemon フラグが立っていないと、それが終了するまで python インタプリタが残る。daemon フラグが立っていると、他のに合わせて自動で死亡する。

os.system で & をつけて呼び出した場合、python インタプリタの子プロセスではなくなる(pstree で確認)。したがって、python インタプリタを終了してもプロセスは残る。& を付けずに daemon スレッドから起動した場合、Python インタプリタの子としてサブプロセスが起動するが、インタプリタを終了した時点で親プロセスの変更が行われ(どういう仕組み?)、やはりサブプロセスは残る。

import os
import threading

def worker():
    os.system("gedit &") # try without &
    print "worker thread end"

th = threading.Thread(target=worker)
th.daemon = True # try False
th.start()
print "Thread started"
raw_input()
print "Main thread end"