Я хочу прочитать текущие результаты из потока (который имеет высокую частоту дискретизации).Поток считывает значения датчика с оборудования с временем цикла 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