从一个方向读取线程时是否需要技巧(例如队列,锁等)

时间:2019-05-26 12:59:26

标签: python multithreading gil

我想从线程(采样率高)读取当前结果。线程从硬件读取传感器值,循环时间为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

0 个答案:

没有答案