2016-10-04 5 views
0

スレッドとマルチプロセッシングの新機能です。私はプロセスを開始したいくつかのコードを持っていると私は、コードは以下のこれに似ているこのPythonのスレッドと文字列

wating.... 

のようなもののアクティブ待ち状態を表示するために出力を望んでいた:

輸入 インポート時間

スレッディング
class ThreadExample(object): 

    def __init__(self): 
     self.pause = True 
     threading.Thread(target=self.second_thread).start() 
     # Some other processes 
     print("Waiting", end="") 
     while self.pause: 
      time.sleep(1) 
      print(".", end="") 
     print("Hooray!") 

    def second_thread(self): 
     print("timer started") 
     time.sleep(3) 
     self.pause = False 
     print("timer finished") 

if __name__ == "__main__": 
    ThreadExample() 

私は上記のコードを実行すると、私は出力を受け取る:

timer started 
Do something else..timer finished 
. 
Hooray! 

は驚くことではありませんが、始めに「timer started」と表示され、残りのテキストは最後に表示されます。 、ドットが1秒単位で表示され

timer started 
Do something else. 
. 
timer finished 
. 
Hooray 

:Iは、ラインプリントを変更した場合

( " "端部が=" ")(")を印刷するために"、私は、次の出力を受信しますそれが私の意図だった。

end = ""なしで1行に 'Waiting ...'を表示する方法はありますか?

第2に、これはprint()関数の内部と関係があると思いますが、そうでない場合は別の方法でスレッドを実行する必要がありますか?問題がGILではないと私は思っています。私はマルチプロセスを試しました。プロセスと同じ結果を得ました。

答えて

1

これはおそらくprintのバッファリングによるものです。それは\nと(バッファオーバーフローやプログラム終了のような)いくつかの機会にフラッシュされます。代わりにprintのこれを試してみてください。

どこでも
import sys 

def unbuffered_print(msg): 
    sys.stdout.write(msg) 
    sys.stdout.flush() 

... 
unbuffered_print('.') 

+0

注:現代のPython(3.3以降)では、 'print'は' flush = True'を渡して、印刷後にフラッシュすることができます(https://docs.python.org/3/library/functions)。 html#print)、 'print'関数の完全なパワー/柔軟性を保ちます。 'print( '。'、end = ''、flush = True)'もこのトリックを行います。 – ShadowRanger

+0

ありがとう、それは非常に便利です。 – VectorVictor