检查queue.empty()会产生令人费解的行为

时间:2017-02-17 17:19:02

标签: python multithreading

我使用多个线程从不同采集率的多个传感器中提取数据。我有一台30Hz的摄像机和一台200Hz的多轴IMU。在收集数据的方法中,我做了一些基线处理,并将数据推送到队列中以供主代码使用。

我从以下开始我的主要内容。 camq,inerq和plotq都是Queue.Queue()对象。 cammer,惯性和绘图仪都是无限循环收集数据并将其推入队列的方法。

t1 = Thread(target=cammer, args = (camq,))
t2 = Thread(target = inertial, args = (inerq,))
t3 = Thread(target = plotter, args = (plotq,))
t1.setDaemon(True)
t2.setDaemon(True)
t3.setDaemon(True)
t1.start()
t2.start()
t3.start()

我的应用程序的关键值是IMU值。因此,在我的主代码中的无限循环中,调步项是读取这些值的队列。我的问题是我不想在代码继续执行之前等待相机队列填充。因此,我在主要代码中完成了以下操作:

while True:
    result = inerq.get() #Get the inertial data as it comes

    #Many lines of inertial processing code

    if not camq.empty(): #Check if the camera queue is empty
        if camq.get_nowait() >297 and camq.get_nowait() <303: #If it isn't empty poll it to see if it meets the criteria.

            #Many lines of kalman filtering

我想使用queue.get_nowait(),所以我不会坐在那里等待我的相机数据,这比IMU数据慢得多。当我这样做时,我得到queue.empty,所以我用上面的queue.empty()查询来处理它。

当我这样做时,我得到错误&#34;主线程不在主循环中#34;。值得注意的是,如果我只是这样做:

if camq.get() >297 and camq.get() <303: #Poll the camera data

            #Many lines of kalman filtering

代码运行完美,但速度慢得多,因为它等待每个循环的摄像机数据。

有人可以给我一个策略或见解,让我不会等待&#34;对于摄像机队列?

0 个答案:

没有答案