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

2024-06-06 03:43:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用树莓皮和XDB进行物联网工作

我想收集数据并写入XDB。我的pi是4B,XDB版本是1.8。使用python脚本。 通过Chronograf,我发现我写入的数据中存在断点

像这样,突然出现的多段线就是断点。 The begin of breakpointsthe end of breakpoints

我使用生产者和消费者方法的多重处理

生产者收集数据,以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()

数据量约为每秒10k。我知道我的程序是初步的。我对编码还不熟悉

我的程序如何改进?如何解决断点问题

如果您能给我提些有用的建议,我将不胜感激

谢谢


Tags: 数据spidata队列queuedevicejs消费者