Python:在线程之间共享连续数据

时间:2018-08-15 10:26:46

标签: python multithreading queue

所以我试图以连续的方式在两个线程之间共享数据。该程序应保持运行直到被要求停止。我的问题是队列。通常,它应该在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"

2 个答案:

答案 0 :(得分:2)

这与线程或共享数据无关。您正在覆盖变量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:作为一般规则,每当您收到类型为XXX object has no attribute YYY的错误时,很可能是您的变量具有完全错误的数据(即不是您期望的类型) )。

建议2 :不要偷懒,并使用xyzp,{{1 }},qrab。给他们起真实的名字。您将减少错误。

答案 1 :(得分:0)

您正在列表理解内使用q,因此将覆盖队列q。最好使用有说服力的变量名,以免发生此类错误。