如何在对传感器进行采样时使用多处理来绘制数据?



我正在尝试使用多处理python库在收集数据时进行绘图,我不想中断数据收集或减慢它的速度。我不确定如何存储数据并将其发送到多处理以干净地绘制。也不确定我是否可以使用 matplotlib。

我尝试创建一个管道和一个队列。我也尝试过使用锁,但对我来说都不够好用。我没有尝试使用Pool,因为我没有运行很多小进程,我只是运行数据收集过程然后绘制。根据我对玩库的理解,你启动了一个进程,这将使进程开始吗?加入进程后,它将等到返回某些内容,然后继续代码。我还尝试了正常的数据收集,然后添加了一个单独的绘图过程,它们都是连续循环,会以键盘中断停止。

from multiprocessing import Process, Lock, Pipe
import time
import numpy as np
import matplotlib.pyplot as plt
def collectData(sender):
    xVal = np.random.rand() + np.random.randint(0,10)
    yval = 23 + np.random.rand()
    time.sleep(0.001)
    sender.send([xVal,yVal])
def plottingData(receiver,fig,ax):
    connect = receiver.recv()
    print(connect)
    ax.scatter(connect[0],connect[1])
    plt.show()
if __name__ == '__main__':
    fig, ax = plt.subplots()
    ax.scatter([],[])
    plt.show(block=False)
    receiver, sender = Pipe(False)
    for i in range(10):
        print('Start process...')
        duta = Process(target=collectData, args=(sender,))
        plut = Process(target=plottingData, args=(receiver,fig,ax))
        duta.start()
        plut.start()
        print('...done with process')
    duta.join()
    plut.join()
    print('Completed multiprocessing')   

这只是一个简单的示例,我正在尝试编写代码以通过在它们之间传递数据来模拟数据收集和绘图。这是尝试构建的基本层。

我正在尝试做的一些事情:像我现在一样循环我的绘图。它连续运行,并以键盘中断停止。添加绘图,以便我可以看到数据,但我不想减慢数据收集速度。

根据我对代码的理解。流程希望完成然后继续前进,这使得连续收集变得困难。绘图也告诉我这一点,因为我打开了 10 个单独的图形,直到我关闭图形窗口才完成。我正在尝试传递一个熊猫数据框,然后进行绘图,但无法弄清楚这是否可以通过管道或什么。

任何帮助了解多处理库将不胜感激!

谢谢

至于在某个过程中收集数据并将其绘制在另一个过程中,您可以执行以下操作:

from multiprocessing import Process, Queue
import time
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
def collectData(communicator):
    while True:
        xval = np.random.rand() + np.random.randint(0,1)
        yval =  np.random.rand()
        communicator.put([xval,yval]) # we use the Queue here to commuicate to the other process. Any process is
        # allowed to put data into or extract data from. So the data collection process simply keeps putting data in.
        time.sleep(1) # not to overload this example ;)
def update(frame, communicator: Queue): # here frame needs to be accepted by the function since this is used in FuncAnimations
    data = communicator.get() # this blocks untill it gets some data
    xdata.append(data[0])
    ydata.append(data[1])
    ln.set_data(xdata, ydata)
    return ln,
if __name__ == '__main__':
    fig, ax = plt.subplots()
    ax.set_xlim([0, 1]) # set the limits to the values you expect
    ax.set_ylim([0, 1])
    xdata, ydata = [], []
    ln, = plt.plot([], [], 'ro')
    communicator = Queue()
    print('Start process...')
    duta = Process(target=collectData, args=(communicator,))
    duta.start()
    ani = FuncAnimation(fig, update, blit=True, fargs=(communicator,))
    plt.show()
    print('...done with process')
    duta.join()
    print('Completed multiprocessing')

所以这个想法是 duta 进程不断向队列添加数据,而调用 FuncAnimation 的主要初始进程一直在等待,直到找到任何要绘制的内容。

如果你想连续接收和绘制数据,你可能想要使用多线程和matplotlib的FuncAnimation工具。设置线程以接收数据并将其存储在某种形式的列表中,然后在动画功能中更新线图/散点图值以查看反映在图上的变化。确保动画在程序的主循环中运行,否则可能会导致问题。

相关内容

  • 没有找到相关文章

最新更新