Нужна ли Python Queue для простого потока байтов между потоками? - PullRequest
2 голосов
/ 29 октября 2009

У меня есть простой поток, который захватывает байты из гнезда Bluetooth RFCOMM (похожего на последовательный порт) и выгружает их в Queue.Queue (FIFO), который выглядит как типичный метод обмена данными между потоками. Работает нормально.

Это перебор? Могу ли я просто использовать bytearray, тогда мой поток чтения .append(somebyte) и функция обработки просто .pop(0)? Я не уверен, предназначены ли средства защиты в очереди для более сложных «многопользовательских, многопользовательских очередей» и бесполезной траты потока байтов «точка-точка». Такие вещи, как очистка очереди или захват нескольких байтов, кажутся более неловкими с очередью по сравнению с более простым типом данных.

Полагаю, что ответ может быть связан с атомным .pop(), но будет ли это тогда иметь значение? ...

Ответы [ 3 ]

3 голосов
/ 29 октября 2009

С Queue вы гарантированно гарантируете многопоточность в любой реализации и версии Python. Полагаясь на тот или иной метод того, чтобы какой-то другой объект был «атомарным» (в данной реализации и версии), вы обычно оставляете вас в покое на этой «атомарности», которая не является сильной гарантией (просто артефакт реализации для конкретной конкретной версии и т используется) и, следовательно, тонкие, ОЧЕНЬ трудные для отладки условия гонки, вводимые при любом обновлении или переносе в другие реализации Python.

Если ваше профилирование говорит вам, что строгие и общие гарантии Queue являются узким местом для вашего конкретного случая использования производителем и потребителем, создайте свою собственную более простую очередь / поток FIFO, гарантирующую многопоточность. Например, если вы узнали, что (за вычетом условий гонки) append и pop идеально подходят для вашего использования, просто создайте класс, который защищает каждого с помощью захвата / снятия блокировки (используйте оператор with ) - Queue добавляет незначительные накладные расходы для поддержки нескольких производителей и потребителей, и вы можете сократить эти несколько наносекунд! -)

0 голосов
/ 29 октября 2009

Если скорость ввода достаточно высока, вы всегда можете буферизовать байты в строку, прежде чем поместить ее в очередь. Это, вероятно, увеличит пропускную способность за счет уменьшения объема выполняемой блокировки за счет небольшой дополнительной задержки на принимающей стороне.

0 голосов
/ 29 октября 2009

Да, pop () атомарная, но я бы придерживался Queue, если производительность не так важна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...