我使用多处理库完成了一个简单的代码,以构建除主代码之外的额外进程(总共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上运行相同的代码,有一点就会弹出一个错误,表示“队列是空的”,就像主进程比第二进程运行得更快。
请猜测为什么会发生这种情况,建议或链接会有所帮助。
由于
答案 0 :(得分:0)
看起来你正在无限循环中添加到队列中,我猜你正在添加数据的速度快于其他进程可以从队列中删除的数据。
您可以在无限循环内定期检查队列大小,如果超过一定数量(比如500项),那么您可以睡几秒钟,然后再次检查。
https://docs.python.org/2/library/queue.html#Queue.Queue.qsize