2012-02-08 9 views
3

を私は質問に編集している:スレッディング・情報パッシング - 混乱からリフレームするにはどのように

import threading 
count = 5 
dev = threading.Thread(name='dev', target=dev,args=(workQueue,count,)) 
dev.setDaemon(True) 
dev.start() 
workQueue = Queue.Queue(10) 
queueLock.acquire() 
workQueue.put(word) 
queueLock.release() 
count = 3 
time.sleep(2) 
count = 5 

one.pyが、ここで私の混乱が、私はキューから値を入れて、取得することができていますさをスレッド間でカウントされますが、カウントの場合は反映されません。

なぜですか?
実際にここで欠落している点は何ですか?

class dev (threading.Thread): 
    def test(self): 
     while 1: 
      print count 
      print self.EPP_Obj 
      queueLock.acquire() 
      if not self.workQueue.empty(): 
       data = self.workQueue.get() 
       print data 
       queueLock.release() 
      else: 
       queueLock.release() 

    def __init__(self, workQueue, EPP_Obj): 
     threading.Thread.__init__(self) 
     self.workQueue = workQueue 
     self.EPP_Obj = EPP_Obj 
+0

@all:私はコードのいくつかの部分を変更しました.soエラーを無視してください。 – Ragav

+0

どこに問題がありますか?なぜdevクラスは 'Thread'サブクラスではありませんか?何[スレッドチュートリアル](http://www.google.com/search?q=python+threading+tutorial)に従っていますか?彼らは通常あなたが求めているものをカバーします。 –

+0

@ Rik Poggi:ちょうどarnoldのコードのように私の必要がありますが、私は達成するためにQUEUEメカニズムを使いたくありません。ちょうどデータを達成したい/スレッドロックを通過するオブジェクト.Notifyメカニズム – Ragav

答えて

5

はのは、例を見てみましょう:

Threadサブクラス:

import threading 

class Dev(threading.Thread): 

    def __init__(self, workQueue, queueLock, count): 
     super(Dev, self).__init__() # super() will call Thread.__init__ for you 
     self.workQueue = workQueue 
     self.queueLock= queueLock 
     self.count = count 

    def run(self): # put inside run your loop 
     data = '' 
     while 1: 
      with self.queueLock: 
       if not self.workQueue.empty(): 
        data = self.workQueue.get() 
        print data 
        print self.count 

      if data == 'quit': 
       break 

withステートメントは、ロックを取得して解放するスマートな方法です。docをご覧ください。

は今実行しているコード:我々上記のコードでは

​​

はどのようにself.count滞在変わらないどんなに私たちがcountに何をすべきかについて明確な例があります。

dev = Dev(work_q, q_lock, count) 

または

dev = Dev(work_q, q_lock, 1) 

が同じものである:
この動作の理由は、呼び出したということです。

Arnold Moonあなたに変更方法が示されましたself.count。私たちの例にすることを調整する:私たちの実行中のコードでset_countを呼び出す

class Dev(threading.Thread): 

    def __init__(self, workQueue, queueLock, count): 
     super(Dev, self).__init__() 
     self.workQueue = workQueue 
     self.queueLock= queueLock 
     self.count = count 

    def set_count(self, value): 
     self.count = value 

    def run(self): 
     data = '' 
     while 1: 
      with self.queueLock: 
       if not self.workQueue.empty(): 
        data = self.workQueue.get() 
        print data 
        print self.count 

      if data == 'quit': 
       break 

self.countの値を変更します:

time.sleep(1) 
with q_lock: 
    work_q.put('word') 
# word 
# 1 

time.sleep(1) 
count = dev.count + 9 
dev.set_count(count) 
with q_lock: 
    work_q.put('dog') 
# dog 
# 10 

count = 'foo' 
with q_lock: 
    work_q.put('quit') 
# quit 
# 10 
dev.join() 

私は、これはあなたには、いくつかの疑問を明確に役立つことを願っています。

+0

非常によく説明されています、ありがとうございます:) – Bawn

+0

キューはスレッドセーフで設計されていません。 – RossGK

3

私はこれがあなたに役立つことを望みます。私はあなたがどのようにあなたが使用する必要があるかわからないと思います。 マルチスレッドのためのいくつかの方法があります。 クラスを使用する方法を紹介します。 以下のコードを実行します。あなたは理解するだろう。

main.py

import stringRepeater 
import Queue 

workqueue = Queue.Queue() 
workqueue.put('test1') 
workqueue.put('test2') 
workqueue.put('test3') 

th = stringRepeater.stringRepeater(workqueue,5) 
th.start() 
print '----daemon is on ----' 
th.setCount(3) 
workqueue.put('test4') 
workqueue.put('test5') 

stringRepeater.py

import threading 

class stringRepeater(threading.Thread): 
    def __init__(self, workQueue, count): 
     threading.Thread.__init__(self) 
     self.workQueue = workQueue 
     self.repeatCount = count 

    def run(self): 
     while True: 
      teststring = self.workQueue.get() 
      for i in range(self.repeatCount): 
       print teststring 

    def setCount(self, newcount): 
     self.repeatCount = newcount 
+0

yes.iはほとんど同じです。しかし、私はキューメカニズムなしでそれを必要としています。可能です。 – Ragav

+0

@Ragavあなたは__init __(self、workQueue、count)の 'count'オブジェクトをどのように渡すか見ることができます: –

+0

replyis __init __(self、workQueue、count)ここでカウント値はスレッドの最初の起動時に働いていますが、htreadを呼び出した後にカウント値を変更しようとすると、動作しません。 .. – Ragav

関連する問題