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的方式工作,我如何复制这种行为?
1条答案
按热度按时间c9qzyr3d1#
我的假设是不正确的,FuncAnimation并不比其他方法更好或更流畅。FuncAnimation实际上并不使用提供给它的间隔。它停留在100毫秒左右。FuncAnimation看起来更好,因为UDP数据包之间的延迟,所以我的50毫秒延迟太激进了。
但是,如果有人对在python中使用NSTimer感到好奇,有一个库可以 Package obj-c类,
pyobjc