python - 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"
解决方案
这与线程或共享数据无关。您正在覆盖变量中的数据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
。给他们真实姓名。你会有更少的错误。
推荐阅读
- django - 如何使用模板显示两个表中的字段(使用 FK)
- opencv - 如何在 opencv-python 中绘制简短的 cv2.line?
- string - 如何构造具有不同生命周期的多个 str 变量的结构?
- python - 如何索引从 .csv 文件中读取的数组
- javascript - Google 表格脚本根据时间戳和列值删除行。为什么一个工作而不是另一个?
- json - 使用 JSON 从字典中的列表中提取数据
- python - 使用python InvalidFileException在excel load_workbook中写入.log:openpyxl不支持.log文件格式,请
- bash - 在 Shell 脚本中替换属性文件中的变量
- javascript - 在 [React] 中搜索/过滤数据表
- firebase - Firestore - 我做错了什么?