You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提升小等待值(<10ms)下asyncio.sleep()的性能问题咨询

异步协程控制步进电机的定时精度优化问题

我用树莓派通过python-osc服务器控制步进电机,在异步进程里用await asyncio.sleep(wait_in_s)生成触发信号。测试发现频率高于100Hz时,非阻塞的asyncio.sleep()比阻塞的time.sleep()性能差很多,会出现离散步现象。

实测对比图

  • asyncio.sleep():指令等待时间与实测等待时间对比
    Asyncio.sleep(): 指令等待时间与实测等待时间对比

  • time.sleep():指令等待时间与实测等待时间对比
    time.sleep(): 指令等待时间与实测等待时间对比

核心疑问

有没有性能更优的异步协程可用?或者有没有办法以异步方式使用time.sleep()函数?

限制条件

因为需要计数脉冲以让步进电机停在特定角度,还要进行速度升降,所以无法使用硬件PWM控制器。

asyncio.sleep()测试代码

import time
import asyncio
import numpy as np

from matplotlib import pyplot as plt

async def main(frequency):
    time_last = time.time()
    x_end = 3
    sleep_meas = 0
    await asyncio.sleep(1 / (frequency))
    await asyncio.sleep(1 / (frequency))
    await asyncio.sleep(1 / (frequency))
    sleep_meas = time.time() - time_last
    print(f"{frequency}: {1/(sleep_meas/x_end)}")
    return 1/(sleep_meas/x_end)

f = np.geomspace(10, 5000, 1000)

f_meas = []
for freq in f:
    f_meas.append(asyncio.run(main(freq)))

fig, ax = plt.subplots()
ax.plot(f, f_meas)
ax.set_xlabel("commanded frequency")
ax.set_ylabel("measured frequency")

plt.savefig("test3.png")
plt.show()

内容的提问来源于stack exchange,提问作者flo42

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:32:09