2017-04-17 12 views
1

2つ目はraw_input()を使用して入力を待っているので、ループを独立させようとしています。これを行うために、私はこれを行う最善の方法がマルチスレッドであることを発見しました。それがどのように機能するかを理解しようとしています。私はこれを書いた:見て期待I`d何マルチスレッドの導入 - 一度に2つのループを実行する

from threading import Thread 
import time 
def loopA(): 
    while True: 
     print "1" 
     time.sleep(1) 
def loopB(): 
    while True: 
     print "2" 
     time.sleep(1) 
threadA = Thread(target = loopA) 
threadB = Thread(target = loopB) 
threadA.run() 
threadB.run() 

threadA.join() 
threadB.join() 

はシェルに印刷されている1Sと2Sの行ですが、それがないすべては1秒だけの行です。 2番目のスレッドにも関与するにはどうすればいいですか?

編集:OKので、私は移動している:

from threading import Thread 
import time 
def loopA(): 
    while True: 
     print "1" 
     time.sleep(1) 
if __name__ == "__main__": 
    Thread(target = loopA).start() 
    while True: 
     n = raw_input("enter here:") 
     print n 

私が今したいことは1度も繰り返し印刷されている、と私は何かを書くとリターンを打つたび、それだけで印刷されるはずですが、 1秒のループは決して止めてはいけません。

+0

あなたの2番目のコードは私のために働く...何をしていますか? – Aaron

+1

スレッドは、同期化されていないリソース、特にコンソールのために競合しています。 loopAのループをsleep10に設定した場合は、「12345」と入力してプリントを待ってから「67890」と入力し、raw_inputは「67890」となります。 printステートメントは、コンソールがすべてを破棄してraw_inputでやり直すようにしました。 –

+0

2番目のコード:入力を書き込んでいても、まだreturnを押さなかったとしても、1を1秒ごとに印刷します。入力はプロセスを停止し、私が戻り値を返すまで待機します。ループと一致しないようにします。 –

答えて

0

私が期待しているように動作するように思われるので、あなたが入力をポーリングする2番目の例で何を探しているのかよく分かりません。あなたの最初の例では、Thread.start()の代わりにThread.run()を使用しました。 run属性は、実際の呼び出し可能ファイル(この場合はtarget)への参照であり、スレッドクラスを作成するためにサブクラス化されています。 run()を呼び出すと、新しいスレッドが開始されるのではなく、メインスレッド内のターゲット関数が呼び出されます。このため、第1の例では、2番目のスレッドは決して開始されません。 runからstartに変更すると、この問題が修正されます。

+0

2番目の問題はOS依存である可能性があります –

+0

@KennyOstrom [現時点のリリース](https://github.com/python-git/python/blob/master/Lib/threading.py#L474)自己参照を避けるために、小さな保護機能を備えた単純な「呼び出し」機能です。 – Aaron

+0

まだ、私の目標にまだ助けtho。それは私が望んだことでしたが(元の投稿のコメントを参照)、raw_input()関数が呼び出されると、何か書き込むまで停止します。 –

関連する問題