Требуются ли методы (например, очередь, блокировка, ...) при чтении из потока в одном направлении - PullRequest
0 голосов
/ 26 мая 2019

Я хочу прочитать текущие результаты из потока (который имеет высокую частоту дискретизации).Поток считывает значения датчика с оборудования с временем цикла 10 мс -> 1 мс работает и 9 мс спит, но оно немного меняется (+/- 0,5 мс).В моем первом подходе я использовал Lifo-Queue.Поток записывает в очередь, а основная программа читает его и очищает очередь после чтения.Это работало хорошо тогда.Пока я не заметил, что после долгого времени работы программы вызывались задержки.Насколько я понял проблему.Каждый queue.put () использует свежую память, а queue.get () + queue.clear () производит очистку памяти.Затем память очищается через определенные промежутки времени.и уборщик поставляется с разным временем выполнения.И это порождает случайные задержки вызовов.

Теперь я спросил себя, имеет ли очередь смысл в этом случае приложения.Поэтому я создал threading.Object и добавил в дополнение к init () и run () функцию get_value_function ("get_io_data"), которая вызывается основным процессом.Основной процесс не имеет возможности обратной записи данных датчика.Обратная запись не нужна.Только чтение в одном направлении из потока в основной процесс.GIL должен фактически предотвращать одновременное чтение и запись.И самое худшее, что может случиться, это то, что было прочитано старое значение.Правильно ли предположение?Я что-то упустил или не понял?

Этот код представляет собой схематическое представление, облегчающее понимание вопроса.Он не работает!

import threading
import time
from My_modul import controller_step


class IOboard(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self, name="IO_board")
        self.__data__ = {}

    def run(self):

        self.init_hardware()

        while True:

            self.data.update(self.read_all_sensors())
            self.data.update(self.read_all_aktors())
            time.sleep(0.09)

    def get_io_data(self):
        return self.__data__


def main():
    app = IOboard()
    app.start()

    while True:
        input_data_now = app.get_io_data()

        out_put_data = controller_step(input_data_now)

        print(time.time() + out_put_data)

        time.sleep(0.1)


if __name__ == "__main__":
    main()

Это мой первый вопрос переполнения стека.Я надеюсь, что я мог понять себя.Мне нужен ответ: если с помощью встроенного вызова поток может запросить переменную, не нарушая закон python или linux-law

...