Frage

Ich habe einen einfachen Thread, der Bytes aus einer Bluetooth-RFCOMM-Steckdose (seriell-portartigen) Steckdose greift und sie in eine abschließt Queue.Queue (FIFO), was wie die typische Methode zum Austausch von Daten zwischen Threads erscheint. Funktioniert gut.

Ist das übertrieben? Könnte ich nur einen Bytearray verwenden und dann meinen Leser -Thread haben .append(somebyte) und die Verarbeitungsfunktion nur .pop(0)? Ich bin mir nicht sicher, ob der Schutz in der Warteschlange für komplexere "Multi-Producer, Multi-Consumer-Warteschlangen" und einen Abfall für einen Point-to-Point-Bytestrom gedacht ist. Dinge wie das Spülen der Warteschlange oder das Erreichen mehrerer Bytes mit der Warteschlange im Vergleich zu einem einfacheren Datentyp zu tun.

Ich denke, die Antwort hätte möglicherweise mit dem zu tun, wenn .pop() Ist Atomic, aber wäre es dann überhaupt von Bedeutung? ...

War es hilfreich?

Lösung

Mit Queue, du bist garantiert Threadsafe in jeder Implementierung und Version von Python sein. Wenn Sie sich auf diese oder diese Methode eines anderen Objekts verlassen, ist "Atomic" (in einer bestimmten Implementierung und Version), die normalerweise dieser "Atomizität" ausgeliefert ist 'RE-Verwendung) und daher subtile, sehr schwer zu entschlossene Rennbedingungen, die mit einem Upgrade oder Port auf andere Python-Implementierungen eingeführt werden.

Wenn Ihre Profilerstellung Ihnen das sagt QueueDie starken und allgemeinen Garantien sind ein Engpass für Ihr spezifisches Anwendungsfall für den Hersteller von Verbrauchern. Machen Sie Ihr eigenes, einfacher garantiert-threadsafe fifo-Warteschlangen/-stream. Wenn Sie das zum Beispiel herausgefunden haben (Netz der Rassenbedingungen) append und pop Wäre perfekt für Ihre Verwendung, erstellen Sie einfach eine Klasse, die jeweils mit einem Schloss erfasst/freigegeben wird (verwenden Sie a with Aussage) -- Queue Fügt winziger Overhead hinzu, um mehrere Produzenten und Verbraucher zu unterstützen, und Sie können diese wenigen Nanosekunden rasieren!-)

Andere Tipps

Ja, Pop () ist atomic, aber ich würde mich an die Warteschlange halten, wenn die Leistung nicht besonders wichtig ist.

Wenn die Eingangsrate schnell genug ist, können Sie immer Bytes in eine Zeichenfolge puffern, bevor Sie diese in die Warteschlange drücken. Dies wird wahrscheinlich den Durchsatz erhöhen, indem die Menge an Verriegelung auf Kosten einer kleinen zusätzlichen Latenz am Empfangsende verringert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top