Python 为什么我的多重处理会暂停一段时间?
我正在使用树莓皮和XDB进行物联网工作 我想收集数据并写入XDB。我的pi是4B,XDB版本是1.8。使用python脚本。 通过Chronograf,我发现我写入的数据中存在断点 像这样,突然出现的多段线就是断点。 我使用生产者和消费者方法的多重处理 生产者收集数据,以JS格式编写,并将其放入队列 消费者制作列表并附加队列的数据。当列表长度为10000时发送到XDB 我已经使用logging.info进行了检查,发现生产者将暂停一段时间,因此会有断点。但我不知道为什么会发生这种情况 以下是相关代码:Python 为什么我的多重处理会暂停一段时间?,python,raspberry-pi,multiprocessing,iot,influxdb,Python,Raspberry Pi,Multiprocessing,Iot,Influxdb,我正在使用树莓皮和XDB进行物联网工作 我想收集数据并写入XDB。我的pi是4B,XDB版本是1.8。使用python脚本。 通过Chronograf,我发现我写入的数据中存在断点 像这样,突然出现的多段线就是断点。 我使用生产者和消费者方法的多重处理 生产者收集数据,以JS格式编写,并将其放入队列 消费者制作列表并附加队列的数据。当列表长度为10000时发送到XDB 我已经使用logging.info进行了检查,发现生产者将暂停一段时间,因此会有断点。但我不知道为什么会发生这种情况 以下是相
def producer(q):
while True:
timeNow=datetime.utcnow()
adc = spi.transfer(device_0, data_out)
val = (adc[1]*256 + adc[2]-412)/512 #read data
js = {
"measurement": "mydb",
"time": timeNow,
"tags": {
},
"fields": {
"sensor": val
}
}
q.put(js) #put in queue
def consumer(q):
body=[]
i=0
while True:
while i<10000:
body.append(q.get()) #get js from queue
i+=1
i=0
res = client.write_points(body) #send data
body.clear()
if __name__ == "__main__":
q=Queue(maxsize = 10000000) #set queue length
device_0 = spi.openSPI(device="/dev/spidev0.0",
mode=0,
speed=1000000) #set spi sampling rate 1000000
data_out = (1,128,0)
adc=(0,0,0)
client = InfluxDBClient(host='localhost', port=8086, username='admin', password='admin', database= 'mydb',ssl=False, verify_ssl=False) #set influxDB
p1 = Process(target=producer,args=(q,))
c1 = Process(target=consumer,args=(q,))
p1.start()
c1.start()
def生产商(q):
尽管如此:
timeNow=datetime.utcnow()
adc=spi.传输(设备0,数据输出)
val=(adc[1]*256+adc[2]-412)/512读取数据
js={
“测量”:“mydb”,
“时间”:时间现在,
“标签”:{
},
“字段”:{
“传感器”:val
}
}
q、 放入(js)#放入队列
def耗电元件(q):
正文=[]
i=0
尽管如此:
而iLinux不是一个实时操作系统。延误多长时间?他们多久发生一次?您是否尝试过一个不接收数据的简单程序,该程序尝试每100us向DB写入数据,并查看输出的频率?延迟可能约为0.05秒或更高。它发生在consumer()的新循环开始时。我已经尝试过每100秒发送一次数据,断点也会出现。如何解决这个问题?我认为这只是Pi Linux的一个特性,可能是其他所有Linux的特性:它们不是实时操作系统,并且由于内核、交换、其他更高优先级的任务等,您将获得不可预测的时间延迟。同样的事情可能发生在Windows上。这就是您可能使用“嵌入式”非Linux环境的原因:以获得更可预测的响应时间。也许您可以将10kHz读数的责任移交给一个单独的机构,例如arduino(即,不基于Linux,并且经过仔细编程)如果有足够的缓冲,那么就能够在不丢失任何东西的情况下将数据发送到Pi您可能想尝试使用DMA和SPI-不确定这是否可行,但如果可行,您可以确保无论Linux进程切换等情况如何,此操作的I/O方面都能继续进行。是的,我在windows上运行此脚本,问题也会出现。您的意思是这可能是系统的问题,但不是我的代码逻辑或使用python的问题?顺便说一句,你能提供一些关于它们不是实时操作系统的参考吗?谢谢Linux不是实时操作系统。延误多长时间?他们多久发生一次?您是否尝试过一个不接收数据的简单程序,该程序尝试每100us向DB写入数据,并查看输出的频率?延迟可能约为0.05秒或更高。它发生在consumer()的新循环开始时。我已经尝试过每100秒发送一次数据,断点也会出现。如何解决这个问题?我认为这只是Pi Linux的一个特性,可能是其他所有Linux的特性:它们不是实时操作系统,并且由于内核、交换、其他更高优先级的任务等,您将获得不可预测的时间延迟。同样的事情可能发生在Windows上。这就是您可能使用“嵌入式”非Linux环境的原因:以获得更可预测的响应时间。也许您可以将10kHz读数的责任移交给一个单独的机构,例如arduino(即,不基于Linux,并且经过仔细编程)如果有足够的缓冲,那么就能够在不丢失任何东西的情况下将数据发送到Pi您可能想尝试使用DMA和SPI-不确定这是否可行,但如果可行,您可以确保无论Linux进程切换等情况如何,此操作的I/O方面都能继续进行。是的,我在windows上运行此脚本,问题也会出现。您的意思是这可能是系统的问题,但不是我的代码逻辑或使用python的问题?顺便说一句,你能提供一些关于它们不是实时操作系统的参考吗?谢谢