2017-02-14 11 views
0

Я разрабатываю скрипт Python, в котором я беру данные из устройства BLE со скоростью около 50-200 Гц. По состоянию на сейчас, я делаю это синхронно:«Правильный» процесс для выборки с внешнего устройства (многопоточность/синхронизация) в Python

while True: 
    if time_now > time_before + (1/sample_rate): 
    do_stuff() 

Это прекрасно работает, за исключением того, что она полностью блокирующей нитей и других приложений (если я хочу совместить с Qt GUI, например), за исключением. Каков правильный способ решения этой проблемы?

  • Могу ли я легко реализовать многопоточную установку, где каждый «пробоотборник» (while-loop) получает свой собственный поток?
  • Должен ли я реализовать операции таймера и как убедиться, что сценарий не убит во время ожидания нового образца?

Моя проблема аналогична this, которая, однако, предназначена для C#.

+0

Я бы отделил процедуру опроса в выделенном потоке, который будет записывать образцы где-нибудь (память, очередь и т. Д.). Затем в других частях приложения я читал эти образцы, когда они были доступны. Преимущество в том, что hw fault/block не блокирует вашу скриптовую логику. – BeerBaron

+0

Вам нужно вообще опросить? Не реализует ли устройство уведомления, чтобы вы были асинхронно и автоматически уведомлены каждый раз, когда изменяется характеристика? Посмотрите примеры BLE, чтобы увидеть, как включить уведомления об изменениях для данного признака. –

ответ

0

Мне нравится Javascript setInterval pattern, я думаю, это больше похоже на то, что вы хотите.

import threading 

def setInterval(func,time): 
    e = threading.Event() 
    while not e.wait(time): 
     func() 

def foo(): 
    print "do poll here" 

# using 
setInterval(foo,5) 

https://stackoverflow.com/a/39842247/1598412

1

Если сама выборка не займет много времени, вы могли бы использовать QTimer и сделать выборку в паз на тайм-аут. Если требуется много времени блокировать ввод-вывод и не выполнять код python, вероятно, вы должны использовать Thread для опроса и отправить результат в основной поток с использованием сигнала. Если выборка использует много времени для выполнения кода python, вам не повезло с большинством реализаций python из-за GIL (Global Interpreter Lock). В большинстве реализаций python только один поток может активно выполнять код python. Таким образом, реальный параллелизм в pyhton часто делается путем создания новых процессов вместо новых потоков.