Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的多重处理会暂停一段时间?_Python_Raspberry Pi_Multiprocessing_Iot_Influxdb - Fatal编程技术网

Python 为什么我的多重处理会暂停一段时间?

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进行了检查,发现生产者将暂停一段时间,因此会有断点。但我不知道为什么会发生这种情况 以下是相

我正在使用树莓皮和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的问题?顺便说一句,你能提供一些关于它们不是实时操作系统的参考吗?谢谢