2017-06-16 4 views
0

ich die folgenden Threads haben, denn wo die Warteschlange q ist leer die meiste Zeit:Python mit queue.get Blockierung() ohne Ausnahmen oder besetzt warten

def run(self): 

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

Wenn der Ausfahrt-Flag gesetzt ist, dann ist es nicht wahrscheinlich sofort beenden, da es zur Zeit bei

items = self.q.get() 

blockiert wahrscheinlich ist, wenn ich auf sie ein Timeout setzen

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

Ich werde oft die Empty-Exception auslösen, da die Queue häufiger leer ist als nicht und mehr Ressourcen als ich möchte verwenden.

Wenn ich damit beschäftigt Warte tun wie

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 

Dann beschäftigt ich warten, anstatt die Sperrmerkmal Queue.get(), die hässlich scheint. Es scheint, als würde ich hier die elegante Lösung dieses Problems vermissen? Gibt es einen oder sollte ich einfach die busy warting Lösung nutzen?

Antwort

0

Anstatt ein exit_flag Flag zu verwenden, sollten Sie in Erwägung ziehen, ein spezielles "Shutdown" -Indikator in die Warteschlange zu setzen. Wenn der Mitarbeiter eine Abschaltanzeige aus der Warteschlange nimmt, muss er die Abschaltanzeige erkennen und herunterfahren anstatt weiterzumachen.

+0

Ja, das klingt nach der besten Lösung. Danke vielmals. – user2247969

0

Ein Ansatz ohne Abhängigkeiten von Drittanbietern besteht darin, das Consumer/Producer-Muster zu verwenden, bei dem der Code in seinem eigenen Thread ausgeführt wird, damit er nicht blockiert wird.

Verwandte Themen