matplotlib动画vs python事件循环(事件循环给出不稳定的结果)

fwzugrvs  于 2023-11-22  发布在  Python
关注(0)|答案(1)|浏览(112)

matplotlib FuncAnimation计时器的效果明显好于python事件循环或主线程while-loop。

我有一个脚本,它发送一个UDP缓冲区到微控制器来控制LED。我用matplotlib绘制和“模拟”这些LED,也可以在FunAnimation回调中发送UDP缓冲区。
当udp数据包在FuncAnimation Timer回调函数中发送时,数据包会以平滑、及时的方式被接收。当使用python事件循环、线程或简单的sleep/while-loop时,它会不一致和不稳定。
下面是matplotlib FunAnimation代码的编辑示例(它工作得很好):

# matplotlib use case
def update(_):
    send_udp_buffer()
    return scat # scatter plot of LEDs

ani = animation.FuncAnimation(
    fig=fig,
    func=update,
    frames=60,
    interval=50, # 50 milliseconds
)

字符串
下面是一个我尝试过的基于while循环的通用代码的例子(结果不稳定且不一致):

# Standard while-loop
while True:
    send_udp_buffer()
    time.sleep(.05)

# python event-loop

import asyncio

async def periodic():
    while True:
        send_udp_buffer()
        await asyncio.sleep(0.05)

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
task = loop.create_task(periodic())


我在MacOSX上,所以FuncAnimation使用的Timer是TimerMac,它是NSTimer的 Package 器。我试过包括它并利用它,但它似乎有一些隐藏的实现细节。

我的问题

为什么事件循环不以类似于matplotlib Timer的方式工作,我如何复制这种行为?

c9qzyr3d

c9qzyr3d1#

我的假设是不正确的,FuncAnimation并不比其他方法更好或更流畅。FuncAnimation实际上并不使用提供给它的间隔。它停留在100毫秒左右。FuncAnimation看起来更好,因为UDP数据包之间的延迟,所以我的50毫秒延迟太激进了。
但是,如果有人对在python中使用NSTimer感到好奇,有一个库可以 Package obj-c类,pyobjc

相关问题