2017-08-01 11 views
0

誰かが、このスレッドコードがクラスのメソッドを呼び出すのが完了しなかった理由を明かにしてもらえますか?Pythonスレッドキューでクラスメソッドを呼び出す

from Queue import Queue 
from threading import Thread 

class SimpleThing(object): 
    def __init__(self, name): 
     self.name = name 

    def print_name(self): 
     print self.name 

class ThingSpawner(object): 
    def __init__(self, name_list): 
     self.things = [SimpleThing(name) for name in name_list] 
     self.thread_queue = Queue() 

    def run(self): 
     for thing in self.things: 
      t = Thread(target=thing.print_name, name=thing.name) 
      t.daemon = True 
      t.start() 
      self.thread_queue.put(t) 
     self.thread_queue.join() 

thing_list = ['cat', 'dog', 'llama', 'bat'] 

sp = ThingSpawner(thing_list) 
sp.run() 

コードは明らかにprint_nameメソッドを実行しますが、join()と出ないだろう。

join()が完了するようにこのコードを修正する最も簡単な方法は何ですか?モチベーションは、既存のPythonコントロールクラスをハードウェアの一部として使用し、コントロールクラスの(非常に遅い)メソッドを並行して呼び出すことができます。ありがとう!

答えて

1

あなたは明らかに、Queueにいくつかのスレッドを入れている

self.thread_queue.put(t) 

を行っています。しかし、私は本当に理由は分かりません。何かのためにそのキューを再び使用することはありません。それはまったく必要ありません。あなたはそれを空にしていないか、それを何もしないので、さらに悪いことに、あなたがして、基本的に起こることはありません空のキューのために永遠に待つ

self.thread_queue.join() 

を呼び出します。

それはあなたが望むものではありませんしかし

from threading import Thread 

class SimpleThing(object): 
    def __init__(self, name): 
     self.name = name 

    def print_name(self): 
     print self.name 

class ThingSpawner(object): 
    def __init__(self, name_list): 
     self.things = [SimpleThing(name) for name in name_list] 

    def run(self): 
     for thing in self.things: 
      t = Thread(target=thing.print_name, name=thing.name) 
      t.daemon = True 
      t.start() 

thing_list = ['cat', 'dog', 'llama', 'bat'] 

sp = ThingSpawner(thing_list) 
sp.run() 

...私はすべてのコードをコピー&ペーストが、まったくQueueせずに、すべてが正常であれば!あなたのスレッドはデーモンなので、メインプログラムが終了してもまだ終了していなくても終了します(たとえば、名前を印刷する前にsleep(1)のような遅延を追加した場合)。完了するのを待つ場合は、キューではなくスレッド上でjoin()に電話する必要があります。だから我々は、最初のスレッドを返します:

def run(self): 
     all_threads = [] 
     for thing in self.things: 
      t = Thread(target=thing.print_name, name=thing.name) 
      t.daemon = True 
      t.start() 
      all_threads.append(t) 
     return all_threads 

そして、我々run我々はこのやる:私はちょうど受け入れられてきた明確な答えのために

threads = sp.run() 
for t in threads: 
    t.join() 
0

おかげオフェルを - 私はを実際にキューを正しく使用していません!私は私のミスを理解したら、スレッドとキューに

from Queue import Queue 
from threading import Thread 

class SimpleThing(object): 
    def __init__(self, name, q): 
     self.name = name 

    def print_name(self, q): 
     print self.name 
     q.get() 
     q.task_done() 

class ThingSpawner(object): 
    def __init__(self, name_list): 
     self.thread_queue = Queue() 
     self.things = [SimpleThing(name, self.thread_queue) for name in name_list] 


    def run(self): 
     for thing in self.things: 
      t = Thread(target=thing.print_name, name=thing.name, args=(self.thread_queue,)) 
      t.daemon = True 
      t.start() 
      self.thread_queue.put(t) 
     self.thread_queue.join() 

thing_list = ['cat', 'dog', 'llama', 'bat'] 

sp = ThingSpawner(thing_list) 
sp.run() 

This tutorial有用であった:今、あなたは私の誤りを指摘してきたキューに自分自身をreacquaintedた、繁栄のために、ここでキューを使用して別のアプローチです。

関連する問題