2017-06-16 16 views
0

を待って忙しいずにほとんどの時間を、私は次のスレッドを持っている、キューqが空である場合)(queue.getでブロッキング:Pythonは例外や

def run(self): 

    while True: 
     if not self.exit_flag: 
      items = self.q.get() 
      q.work_it() 
     else: 
      return 0 

終了フラグが設定されている場合、それはありません私はそれにタイムアウトを置けばそれはおそらく現在

items = self.q.get() 

でブロックしているため、すぐに終了する可能性が高い

items = self.q.get(True, 0.1) 

私はしばしば空の例外を発生させます。なぜなら、キューは私が望むよりも多くのリソースを使って空でないほうが多いからです。

def run(self): 

    while True: 
     if not self.exit_flag: 
      if not self.q.empty(): 
       items = self.q.get() 
       q.work_it() 
      time.sleep(0.1) 
     else: 
      return 0 

は、その後、私は待っている代わりに醜いようだQueue.getのブロッキング機能を()を使用して、忙しい行うように私はビジーウェイトを行う場合。この問題の洗練された解決策がここにないようですね。忙しい待っているソリューションを使っているのですか?

答えて

0

exit_flagフラグを使用する代わりに、特別な「シャットダウン」インジケータをキューに入れることを検討してください。作業者がシャットダウン・インジケータをデキューすると、シャットダウン・インジケータが認識され、シャットダウン・インジケータが継続されます。

+0

これは最適なソリューションのようです。どうもありがとう。 – user2247969

0

第三者の依存関係がないアプローチの1つは、独自のスレッドでコードを実行してブロックするものではないコンシューマ/プロデューサパターンを使用することです。