簡體   English   中英

2個進程之間的raspberry pi 3多處理隊列同步

[英]raspberry pi 3 multiprocessing queue syncronization between 2 processes

我已經使用多處理庫到遠離主代碼建立一個額外的處理(共計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中運行相同的代碼,有一個點時,它會彈出一個錯誤,說:“隊列為空”有點像,如果主流程的運行速度低於過程中的兩個快。

請的為什么會這樣,建議或鏈接任何猜測將是有益的。

謝謝

看起來您正在添加到隊列中的無限循環內部,我猜想您添加數據的速度快於其他進程將其從隊列中移出的速度。

您可以從無限循環內部定期檢查隊列大小,如果隊列大小超過一定數量(例如500個項目),則可以睡幾秒鍾,然后再次檢查。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM