raspberry pi 3多处理队列在2个进程之间同步

时间:2018-01-31 00:28:10

标签: python queue multiprocessing raspberry-pi3

我使用多处理库完成了一个简单的代码,以构建除主代码之外的额外进程(总共2个进程)。我通过Anaconda-spyder v3.2.4在W7 Professional x64上完成了这个代码,它几乎按照我的要求工作,除了我运行代码时增加了我的第二个进程(不是主进程)的内存消耗,直到达到总容量和计算机卡住并冻结(您可以在whindows任务管理器处注意到这一点。)

"""
Example to print data from a function using multiprocessing library
Created on Thu Jan 30 12:07:49 2018
author: Kevin Machado Gamboa
Contct: ing.kevin@hotmail.com
"""
from time import time
import numpy as np
from multiprocessing import Process, Queue, Event

t0=time()

def ppg_parameters(hr, minR, ampR, minIR, ampIR, t):
    HR = float(hr)
    f= HR * (1/60)
    # Spo2 Red signal function
    sR = minR + ampR * (0.05*np.sin(2*np.pi*t*3*f)
                       + 0.4*np.sin(2*np.pi*t*f) + 0.25*np.sin(2*np.pi*t*2*f+45))
    # Spo2 InfraRed signal function
    sIR = minIR + ampIR * (0.05*np.sin(2*np.pi*t*3*f)
                          + 0.4*np.sin(2*np.pi*t*f) + 0.25*np.sin(2*np.pi*t*2*f+45))
    return sR, sIR

def loop(q):
    """
    generates the values of the function ppg_parameters
    """
    hr =  60
    ampR = 1.0814       # amplitud for Red signal
    minR = 0.0   # Desplacement from zero for Red signal
    ampIR = 1.12       # amplitud for InfraRed signal
    minIR = 0.7   # Desplacement from zero for Red signal
    # infinite loop to generate the signal
    while True:
        t = time()-t0
        y = ppg_parameters(hr, minR, ampR, minIR, ampIR, t)
        q.put([t, y[0], y[1]])

if __name__ == "__main__":
    _exit = Event()
    q = Queue()
    p = Process(target=loop, args=(q,))
    p.start()
    # starts the main process
    while q.qsize() != 1:
        try:
            data = q.get(True,2) # takes each data from the queue
            print(data[0], data[1], data[2])
        except KeyboardInterrupt:
            p.terminate()
            p.join()
            print('supposed to stop')
            break

为什么会这样?也许是我的第二个过程的while循环?我不知道。我没有看到这个问题。

此外,如果我在我的Rpi 3模型B上运行相同的代码,有一点就会弹出一个错误,表示“队列是空的”,就像主进程比第二进程运行得更快。

请猜测为什么会发生这种情况,建议或链接会有所帮助。

由于

1 个答案:

答案 0 :(得分:0)

看起来你正在无限循环中添加到队列中,我猜你正在添加数据的速度快于其他进程可以从队列中删除的数据。

您可以在无限循环内定期检查队列大小,如果超过一定数量(比如500项),那么您可以睡几秒钟,然后再次检查。

https://docs.python.org/2/library/queue.html#Queue.Queue.qsize