2016-08-29 31 views
1

誰かが私のコードが "hello"を印刷していない理由を指摘してください。スレッド2 - t2が起動していないと感じます。これはちょうどコードスニペットです、私は私のメインプログラムで実装するために取り組んでいます。基本的に、私の考えは以下の通りです:Pythonスレッディング - シンプルでトリッキーな

  1. 単機能持っている - 「whileループ」
  2. スレッド1でのコードの2つの設定----「IF条件ステートメント」内の1つのコードや他のを持っています - 関数1を使用しています - "While loop"を続けています - 私がプログラムを突然止めるまで
  3. スレッド2やスレッド3、スレッド4などは同じ関数を使いたいですが "if条件文"のコードは
  4. 次のコードではスレッド1を継続的に実行し、thread2はthread1を中断することなくその作業を行います。

コード:

import threading 
import Queue 



def Continuous(stop_event, queue_read, queue_write,lock): 

    #lock.acquire() 
    try: 

     if stop_event == True: 

      print stop_event.is_set() 
      print "hello" 
      c = 7 
      d = 8 
      msg2 = (c+d)*2 
      queue_write.put(msg2) 

     while not stop_event.wait(1): 
      print "hello2" 
      #print ("working on %s" % arg) 
      a = 3; 
      b = 4 
      msg1 = a*b 
      queue_read.put(msg1) 
      time.sleep(1) 

    finally: 
     print "Inside finally" 
     #lock.release() 

    print"Outside try and finally" 




def main(): 

    pill2kill = threading.Event() 
    lock = threading.Lock() 

    pill2kill.clear() 
    queue1 = Queue.Queue() 
    queue2 = Queue.Queue() 
    #self.queue2 = Queue.Queue() 
    t1 = threading.Thread(target = Continuous, args = (pill2kill,queue1,queue2,lock)) 
    t1.deamon = True 
    t1.start() 

    print "asdfasfd" 
    time.sleep(2) 
    pill2kill_1 = threading.Event() 
    pill2kill_1.set() 
    print "hjgkhj" 
    t2 = threading.Thread(target=Continuous, args=(pill2kill_1, queue1, queue2,lock)) 
    t2.start() 
    t2.join() 
    pill2kill.clear() 
    print "End of program" 


main() 

PS:私はこのように私のコードを掲示するために、非常に残念です。 (OPによるその後のコメントは、彼らが期待していたものを、それが明確になるので、コメントから変換)問題がEventの誤用から来るに私は15分以上を試みたと私はそれが

+0

あなたの質問は何ですか?またはエラー? – FamousJameous

+0

奇妙なことに、私はそれを編集しようとしていて、フォーマットがうまくいきません。 – Jezor

+1

@Jezorこれは、コードが間に他の通常の本文の要素を持たない箇条書きリストに続くためです。通常、空のHTMLコメント ''をこのような2つの要素の間に挿入すると、そのトリックが実行されます。 –

答えて

0

をフォーマットし得ることがunsuccesful午前:

  1. if stop_event == True:Falseと評価され、ifブロックは内容を実行しません(stop_eventEventです。boolのタイプと等しくない、if stop_event.is_set():を意味しましたか?)。これにより、helloが印刷されなくなります。
  2. スレッドを作成する前に、スレッドを作成する前に、2番目のスレッドのイベントを設定します。while not stop_event.wait(1):は、ボディを実行せずにすぐにループを終了します(hello2が印刷されないようにします)。予想される唯一の出力はfinallyブロックからfinally以下になります。

サイドノート:t1.deamon = Trueは何もしません。属性の綴りはdaemonです。スレッド0121のためにEventを決してset以来、これはプログラムが決して終了しないことを意味するように思えます。

+0

返信いただきありがとうございます。ロックを使用する方法はありますか?それをどこに置くことをお勧めしますか?間違いなく、私が入れている場所は、私の必要条件を満たすものではありません。 –

+0

@JeshKundem:私は文字通り、あなたが使用するロックを意図していません。つまり、あなたはインターリーブされた出力を得られないように、 'print'のすべての使用をロックするために単一のロックを使うことができます。そうでなければ、あなたの仕事の大半は本質的にスレッドセーフです(' Queue'は、 'Event'sはスレッドセーフです。)、不変型の純粋なローカル使用は安全です。スレッドセーフの問題ではなく、APIレベルでの' Event'の使い方の問題がほとんどです。 – ShadowRanger

関連する問題