首页 > 解决方案 > 从一个方向读取线程时是否需要技术(如队列、锁定等)

问题描述

我想从线程(具有高采样率)读取当前结果。该线程以 10 ms -> 1 ms 工作和 9 ms 睡眠的循环时间从硬件读取传感器值,但它会有所不同(+/- 0.5 ms)。在我的第一种方法中,我使用了 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-law 或 linux-law 的情况下查询变量

标签: pythonmultithreadinggil

解决方案


推荐阅读