Буфер FIFO в питоне

Я пытаюсь получить сигнал от датчика и обработать его в реальном времени с помощью Raspberry и Python. Я использую преобразователь АЦП, чтобы иметь цифровой вход. Мне сказали реализовать что-то вроде буфера, так как обработка времени занимает слишком много времени и остановит захват АЦП. Моя схема:

  1. Поток сбора данных: АЦП выводит образцы с выбранной частотой дискретизации и помещает их в кольцевой буфер (очередь в Python).
  2. Поток обработки: берет образцы из буфера, когда он заполнен, и обрабатывает в одном блоке.

Мой вопрос: как я могу отправить данные АЦП, сохраненные в буфере, одним блоком в код обработки? Я читал, что обрабатывать блоками удобнее, но не знаю, как это сделать. Я хочу использовать потоки, потому что не хочу терять сэмплы


person Tagalog    schedule 10.12.2020    source источник


Ответы (1)


Хотя в Python можно создать несколько потоков, мне жаль говорить, что интерпретатор (стандартный CPython) имеет ограниченные возможности для фактического одновременного выполнения этих потоков. Суть проблемы в том, что интерпретатор не является потокобезопасным, поэтому поток должен удерживать глобальную блокировку интерпретатора или GIL для безопасного доступа к объектам Python: только поток, получивший GIL, может работать с объектами Python или вызывать функции Python/C API.

См. также эти похожие сообщения:

Если возможно, я бы рассмотрел возможность использования Java или C++ или другого языка с лучшей поддержкой многопоточности для этого проекта.

Как я могу отправить данные АЦП, сохраненные в буфере, одним блоком в код обработки?

(Если вы все еще хотите использовать Python), данные ADC можно передать в код обработки как список или массив numpy.

person Pascal Getreuer    schedule 21.12.2020