树莓派 3 多处理队列在 2 个进程之间同步



我使用多处理库完成了一个简单的代码,以构建除主代码之外的额外进程(总共 2 个进程(。我在 W7 Professional x64 上通过 Anaconda-spyder v3.2.4 完成了这段代码,它几乎按照我想要的方式工作,除了当我运行代码时它会增加我的第二个进程(不是主进程(的内存消耗,直到它达到总容量并且计算机卡住并冻结(您可以在 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 上运行相同的代码,当它弹出一个错误时,它会弹出一个错误,说"队列为空",就像主进程比进程二运行得更快一样。

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

谢谢

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

您可以从无限循环内部定期检查队列大小,如果它超过一定数量(例如 500 个项目(,那么您可以休眠几秒钟,然后再次检查。

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

相关内容

  • 没有找到相关文章

最新更新