我使用多处理库完成了一个简单的代码,以构建除主代码之外的额外进程(总共 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