首页 > 解决方案 > Python:在线程之间共享连续数据

问题描述

所以我试图以连续的方式在两个线程之间共享数据。该程序应继续运行,直到被要求停止。我遇到的问题是队列。通常它应该在 get_ratio 函数的 while 循环内。但是当我把它放在那里时,我得到了错误:“numpy.complex128”对象没有属性“get”。此外,当我将它放在 while 循环之前时,它只处理部分数据,因为它位于循环之前。我不知道如何继续从队列中获取数据。有任何想法吗?

import time
import random
import threading as th
import Queue
import numpy as np
import matplotlib.pyplot as plt
import bluetooth
import scipy.fftpack
from MindwaveDataPoints import RawDataPoint
from MindwaveDataPointReader import MindwaveDataPointReader


def get_data(q):
    mindwaveDataPointReader = MindwaveDataPointReader()
    mindwaveDataPointReader.start()

    data=[]
    while(1):


        dataPoint = mindwaveDataPointReader.readNextDataPoint()

        if (dataPoint.__class__ is RawDataPoint):
            data.append(dataPoint)
            q.put(data) #data keeps going into the queue







def get_ratio(q):

    M = [[],[],[],[],[],[],[],[]]
    fft_avg = []
    fft_avg_mod = []
    #loop to cover all the data
    j=0
    k=0
    l=0
    data = q.get() #HERE 

    while(1):
        #data = q.get() #HERE
        if k > 7 :
            fft_avg[:] = []
            fft_avg_mod[:] = []
            fft_avg = [(x+y+z+t+u+v+w+q)/8 for x,y,z,t,u,v,w,q in zip(M[0],M[1],M[2],M[3],M[4],M[5],M[6],M[7])]
            fft_avg_mod = [ abs(x) for x in fft_avg]


        if fft_avg_mod:
            d=random.randint(8,14)
            e=random.randint(14,20)
            alpha=fft_avg_mod[d]
            beta=fft_avg_mod[e]
            ratio=beta/alpha
            print 'ratio' , ratio
        f=k%8
        M[f] = np.fft.fft(data[j:j+32])
        j = j + 32  
        k = k + 1


if __name__ == '__main__':

    q = Queue.Queue(maxsize=0)

    try:
       threadLock = th.Lock()
       threads=[]
       thread1=th.Thread( target=get_data, args=(q,))
       thread2=th.Thread( target=get_ratio, args=(q,))
       thread1.start()
       print 'T1 started'
       time.sleep(10)
       thread2.start()
       print 'T2 started'
       threads.append(thread1)
       threads.append(thread2)
       for t in threads:
            t.join()
    except:
       print "Error: unable to start thread"

标签: pythonmultithreadingqueue

解决方案


这与线程或共享数据无关。您正在覆盖变量中的数据q

while(1):
    data = q.get()

接着:

        fft_avg = [(x+y+z+t+u+v+w+q)/8 for x,y,z,t,u,v,w,q in zip(M[0],M[1],M[2],M[3],M[4],M[5],M[6],M[7])]

最后一行q在列表推导中分配了一个不同的值,因此下次q.get()调用时会出现错误。


建议 1:作为一般规则,每当您收到 type 错误时XXX object has no attribute YYY,很可能是您的变量包含完全错误的数据(即不是您期望的类型)。

建议 2:不要偷懒,使用变量名,如x, y, z, p, q, r, a, b, c。给他们真实姓名。你会有更少的错误。


推荐阅读