Использование разных методов read для получения данных
Этот документ объясняет, как использовать различные методы read, доступные в библиотеке libspectrum, для получения спектральных данных. Библиотека предоставляет три основных способа получения данных: read(), read_non_block() и read_non_stop(), каждый со своим специфическим случаем использования.
Обзор методов read
read()
Метод read() - основной способ получения одного кадра или пакета кадров. Автоматически обрабатывает открытие и закрытие устройства, если оно еще не открыто.
- Функциональность: Получает один кадр (или указанное количество кадров в одном пакете) со спектрометра.
- Работа с устройством: Автоматически открывает устройство, если оно не открыто, и закрывает его после завершения, если оно не было открыто ранее.
- Случай использования: Идеально подходит для получения отдельных измерений или когда требуется синхронное чтение определенного количества спектров.
- Блокирующий: Это блокирующая операция. Метод не вернет результат, пока не завершит получение запрошенного количества спектров.
Пример:
from pyspectrum import Spectrometer
spectrometer = Spectrometer()
# Настройка конфигурации
spectrometer.set_config(
exposure=100, # миллисекунды
n_times=5, # количество измерений
wavelength_calibration_path="calibration.json",
dark_signal_path="dark.pkl"
)
# Получение пакета спектров
spectrum = spectrometer.read()
print(f"Размерность полученного спектра: {spectrum.shape}")
read_non_block()
Метод read_non_block() предоставляет способ неблокирующего чтения кадров со спектрометра. Использует функцию-callback.
- Функциональность: Читает указанное кол-во кадров кускамии указанного размера. Вызывает callback функцию для каждого спектра.
- Работа с устройством: Автоматически открывает устройство, если оно не открыто, и закрывает его после завершения.
- Случай использования: Подходит для ситуаций, когда необходимо обрабатывать спектры по мере их поступления. Может использоваться, если требуется асинхронное чтение определенного количества спектров.
- Неблокирующий: Эта функция неблокирующая, поскольку использует callback-функцию для обработки каждого спектра.
Пример:
from pyspectrum import Spectrometer
from pyspectrum.data import Spectrum
spectrometer = Spectrometer()
# Настройка спектрометра
spectrometer.set_config(
exposure=100,
wavelength_calibration_path="calibration.json",
dark_signal_path="dark.pkl"
)
def process_spectrum(spectrum: Spectrum):
print(f"Получен спектр с размерностью: {spectrum.shape}")
# Реализация обработки спектра здесь
# Чтение 30 кадров с интервалом 10 кадров.
# Функция обратного вызова будет вызвана 3 раза (30 / 10 = 3)
spectrometer.read_non_block(callback=process_spectrum, frames_to_read=30, frames_interval=10)
read_non_stop()
Метод read_non_stop() используется для непрерывного получения данных в режиме реального времени. Использует отдельный поток.
- Функциональность: Непрерывно получает спектры и обрабатывает каждый из них с помощью предоставленной callback-функции.
- Работа с устройством: Автоматически открывает устройство, если оно не открыто, и оставляет его открытым.
- Случай использования: Идеально подходит для приложений, где требуется непрерывный мониторинг спектра, например, для измерений в реальном времени.
- Неблокирующий: Эта функция неблокирующая, поскольку использует отдельный поток для выполнения чтений.
- Метод остановки: Используйте метод
stop_reading()для остановки непрерывного получения данных.
Пример:
from pyspectrum import Spectrometer
from pyspectrum.data import Spectrum
import time
spectrometer = Spectrometer()
# Настройка спектрометра
spectrometer.set_config(
exposure=100,
wavelength_calibration_path="calibration.json",
dark_signal_path="dark.pkl"
)
def process_spectrum(spectrum: Spectrum):
print(f"Получен спектр с размерностью: {spectrum.shape}")
# Реализация обработки спектра здесь
spectrometer.read_non_stop(callback=process_spectrum, frames_interval=100)
# Выполнение других действий в основной программе
# Остановка непрерывного получения данных через определенный период
time.sleep(5)
spectrometer.stop_reading()
Автоматическое управление устройством
Ключевой особенностью семейства методов read является их способность автоматически обрабатывать открытие и закрытие USB-устройства.
- Если устройство еще не открыто: Метод
readоткрывает устройство перед началом получения данных и закрывает его после завершения (если оно не было открыто ранее). - Если устройство уже открыто: Метод
readиспользует существующее соединение, не закрывая его после завершения.
Это поведение упрощает распространенные случаи использования:
- Вы можете использовать метод
read()несколько раз без необходимости вручную вызывать методыopen()иclose(). - Вы можете выполнять несколько чтений подряд с помощью метода
read().
Выбор правильного метода
- Используйте
read()для получения отдельных измерений или пакетов измерений синхронно. - Используйте
read_non_block()для асинхронного получения кадров. - Используйте
read_non_stop()для непрерывного получения данных в режиме реального времени, используя методstop_reading()для остановки процесса.