Une file d'attente Python est-elle nécessaire pour un simple flux d'octets entre les threads?

StackOverflow https://stackoverflow.com/questions/1640112

  •  08-07-2019
  •  | 
  •  

Question

J'ai un simple thread qui récupère des octets à partir d'une prise Bluetooth RFCOMM (semblable à un port série) et les transfère dans un Queue.Queue (FIFO), ce qui semble être la méthode typique d'échange données entre les threads. Fonctionne bien.

Est-ce que c'est exagéré? Est-ce que je pourrais utiliser un bytearray alors que mon lecteur .append (somebyte) et la fonction de traitement juste .pop (0) ? Je ne sais pas si les protections dans la file d'attente sont destinées à des files d'attente plus complexes "multi-producteurs, multi-consommateurs". et un gaspillage pour un flux d'octets point à point. Faire des choses comme vider la file d'attente ou saisir plusieurs octets semble plus difficile avec la file d'attente plutôt qu'un type de données plus simple.

Je suppose que la réponse pourrait être liée à la question de savoir si .pop () est atomique, mais est-ce que cela importerait même alors? ...

Était-ce utile?

La solution

Avec File d'attente , vous êtes garanti d'être threadsafe dans toute implémentation et version de Python. En s'appuyant sur telle ou telle méthode, un autre objet est "atomique". (dans une implémentation et une version données) vous laisse typiquement à la merci de cette "atomicité". n'étant pas une garantie solide (juste un artefact d'implémentation pour la version ponctuelle spécifique que vous utilisez) et par conséquent, des conditions de course subtiles et TRÈS difficiles à déboguer sont introduites avec toute mise à niveau ou portage vers d'autres implémentations Python.

Si votre profilage vous indique que les garanties fortes et générales de Queue constituent un goulot d'étranglement pour votre cas d'utilisation producteur-consommateur spécifique, créez votre propre file d'attente FIFO plus simple à garantir que vous êtes thread-sûr / / courant. Par exemple, si vous avez découvert que (sans tenir compte des conditions de concurrence) append et pop conviendraient parfaitement, créez simplement une classe qui protège chacun avec un verrou. acquérir / libérer (utilisez une instruction avec ) - File d'attente ajoute une surcharge minuscule pour prendre en charge plusieurs producteurs et consommateurs et vous permet de réduire ces quelques nanosecondes! -)

Autres conseils

Oui, pop () est atomique, mais je resterais avec Queue si les performances ne sont pas super importantes.

Si le débit d'entrée est suffisamment rapide, vous pouvez toujours mettre en tampon des octets dans une chaîne avant de l'insérer dans la file d'attente. Cela augmentera probablement le débit en réduisant le nombre de verrous effectués, au prix d'un peu de latence supplémentaire du côté destinataire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top