繁体   English   中英

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

[英]Python: Sharing continuous data between threads

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

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

建议2:不要懒惰,并使用xyzpqrabc等变量名。 给他们起真实的名字。 您将减少错误。

您在列表推导中使用q ,因此覆盖了队列q 最好使用有说服力的变量名,以免发生此类错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM