python - 从一个方向读取线程时是否需要技术(如队列、锁定等)
问题描述
我想从线程(具有高采样率)读取当前结果。该线程以 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 的情况下查询变量
解决方案
推荐阅读
- r - R - 如何在向量中的特定元素周围创建升序/降序数字线
- android - CardView 在添加新项目时更改大小
- flutter - Flutter如何停止在后台状态下播放视频?
- javascript - three.js raycaster 可以与 fbx2gltf 导出的 Group 模型交互吗?
- json - 如何从服务器解码此响应?我被困住了,响应的“数据”在地图中
- c++ - 如何在不重复的情况下在进程之间共享大量数据?(IPC)
- php - 如何在codeigniter的单行中显示相同的id数据?
- android - 如何跟踪我的应用程序的 ActivityManager 加载时间?
- java - 使用 Retrofit 和 PHP 作为后端,无法从 android 中的服务器接收任何响应
- spring-boot - 带有 CompletableFuture 的 Spring Boot 异步调用,异常处理