Python while 循环中的准确睡眠/延迟

2023-12-03

我有一个 while True 循环,它将变量发送到外部函数,然后使用返回的值。该发送/接收过程具有用户可配置的频率,该频率是从外部 .ini 配置文件中保存和读取的。

我尝试过 time.sleep(1 /Frequency),但考虑到其他地方使用的线程数,我对准确性不满意。例如。 60Hz 的频率(周期为 0.0166667)给出的“实际”time.sleep() 周期约为 0.0311。

我的偏好是使用一个额外的 while 循环,它将当前时间与开始时间加上周期进行比较,如下所示:

EndTime = time.time() + (1 / Frequency)
while time.time() - EndTime < 0:
    sleep(0)

这将适合我的 while True 函数的末尾,如下所示:

while True:
    A = random.randint(0, 5)
    B = random.randint(0, 10)
    C = random.randint(0, 20)

    Values = ExternalFunction.main(Variable_A = A, Variable_B = B, Variable_C = C)

    Return_A = Values['A_Out']
    Return_B = Values['B_Out']
    Return_C = Values['C_Out']

    #Updated other functions with Return_A, Return_B and Return_C

    EndTime = time.time() + (1 / Frequency)
    while time.time() - EndTime < 0:
        time.sleep(0)

我遗漏了一些东西,因为添加 while 循环导致该函数仅执行一次。如何才能使上述功能正常运行?这是在非实时操作系统上“精确”频率控制的最佳方法吗?我应该为这个特定组件使用线程吗?我正在 Windows 7(64 位)和 Ubuntu(64 位)上测试此功能。


如果我正确理解你的问题,你想执行ExternalFunction.main在给定的频率。问题是执行ExternalFunction.main本身需要一些时间。如果你不需要非常精细的精度——看来你不需要——我的建议是做这样的事情。

import time

frequency = 1  # Hz
period = 1.0/frequency

while True:
    time_before = time.time()
    [...]
    ExternalFunction.main([...])
    [...]
    while (time.time() - time_before) < period:
        time.sleep(0.001)  # precision here

您可以根据需要调整精度。精度越高(数字越小)将使内部 while 循环执行得更频繁。

当不使用线程时,这会取得不错的结果。然而,当使用 Python 线程时,GIL(全局解释器锁)可确保一次仅运行一个线程。如果您有大量线程,则程序返回主线程可能需要花费太多时间。增加线程之间 Python 更改的频率可能会给您带来更准确的延迟。

将其添加到代码的开头以增加线程切换频率。

import sys
sys.setcheckinterval(1)

1是切换前每个线程执行的指令数(默认为100),较大的数字可以提高性能,但会增加线程切换时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python while 循环中的准确睡眠/延迟 的相关文章

随机推荐

  • 如何确保在应用程序关闭之前处理单例中的对象?

    我使用 WatiN 进行一些自动化测试 我发现为每个测试创建 IE 实例是不可扩展的 每个 IE 实例的创建和关闭时间都快把我折磨死了 TestMethod public void Verify Some Useful Thing usin
  • MySQL:如何转换为EAV?

    假设我有下表 TABLE one id first name last name 1 John Doe 2 Jane Smith 我想将其转换为 EAV TABLE two id fk id attribute value 1 1
  • JQuery 数字格式

    关于这个基本功能有太多的问题和答案 我只见树木不见森林 在 Java 中只有一个简单的答案 java text NumberFormat及其子类 所以我确信大多数插件 问题和答案最终将成熟为 JQuery 的事实上的标准 这个插件是迄今为止
  • 多重处理会导致 Python 崩溃,并给出一个错误:调用 fork() 时可能已在另一个线程中进行

    我对 Python 比较陌生 并尝试为我的 for 循环实现一个多处理模块 我有一个图像 url 数组存储在 img urls 中 我需要下载并应用一些 Google 视觉 if name main img urls ALL MY Imag
  • 在 XSLT/XML 中将日期显示为 DD-MM-YYYY

    当从 XML 拉到 XSLT 1 0 时 一直尝试将文本格式化为显示为 DD MM YYYY 因为我知道在使用 xs date 时 必须在 XSD XML 中将其布局为 YYYY MM DD用过的 这是我正在处理的代码 关于如何显示它有什么
  • __lt__ 而不是 __cmp__

    Python 2 x 有两种重载比较运算符的方法 cmp 或 丰富的比较运算符 例如 lt 据说丰富的比较重载是首选 但为什么会这样呢 丰富的比较运算符更容易实现 但您必须使用几乎相同的逻辑来实现其中的几个 但是 如果您可以使用内置的cmp
  • SetLayeredWindowAttributes 在 Windows 7 上不起作用

    我正在使用 SetLayeredWindowAttributes 使分层窗口的特定颜色透明 这在 Windows XP VISTA 上运行良好 但当我在 Windows 7 上使用相同的方法时 它不起作用 SetLayeredWindowA
  • Heroku 部署失败:[远程拒绝] master -> master(预接收挂钩拒绝):错误:无法推送一些引用

    我将现有应用程序复制到新存储库中 它在本地工作 部署原始工作 我正在使用 PHP Yii 和 Composer 我不知道什么fxp composer asset plugin is C Users Chloe workspace affil
  • 运行 make 时出错:缺少分隔符(您的意思是 TAB 而不是 8 个空格吗?)

    我正在尝试获取 PHPphar我的 Debian VM 上安装的命令行工具如何here描述 1 下载php src 我假设它在 tmp php src中 2 建立目录 tmp phar 3 保存this作为 tmp php src ext
  • Python 二进制转换为十六进制

    我正在尝试将 python 中的二进制文件 gzipped 协议缓冲区对象 转换为字符串转义方式的十六进制字符串 例如 xFA x1C 我都尝试过 repr
  • 如何动态组合 linq 查询?

    假设我有一个表 其中包含字符串中的格式化值 nvarchar 柱子 这些值应该是由某个 const 符号分隔的字符串 让它成为分号 例如 12 0 5 dog four values separated by a semi colon or
  • AppWidgetProvider:未调用 onEnabled 方法

    我有显示来自内容提供商的数据的小部件 我想知道内容提供商中的数据何时发生变化 据我所知 这样做的方法是 context getContentResolver registerContentObserver 但是当我添加小部件的第一个实例时
  • Swift 选项 - 从“x”到“x”的条件转换警告始终成功

    我想知道是否有办法关闭 避免 xcode 中的 黄色 警告if let NSUserDefaults构造其中键具有已知值的结构 例如 if let x NSUserDefaults standardUserDefaults integerF
  • 带投影的 CreateCriteria 不会选择所有列

    我的问题就像Grails 投影未返回所有属性且未分组 我有以下标准 def sharedDocumentsInstanceList SharedDocuments createCriteria list params createAlias
  • Angular HttpClient 方法不转换响应类型

    刚刚开始使用新的 HttpClient 但每当我拨打电话时 响应都不会使用提供的类型进行转换 我尝试了接口和类 现在我假设您只能使用接口来转换为响应 因为这是我们在文档中看到的唯一示例 我宁愿使用一个类在模型中包含一些辅助函数 有没有办法以
  • Git 工作流程 - 设置构建流程

    免责声明 我已经使用 Git 一段时间了 但仍然觉得它令人困惑 我正在为一个项目设置构建过程 但在更新 git 存储库时遇到问题 我在服务器上创建了存储库 假设为 C MyProject 我使用 SourceTree 将我的计算机连接到存储
  • 地图和过滤器内的 setState

    最近在学习react native中的map和filter方法 有一个问题 找到数组的特定行 带过滤器 后 如何仅设置该特定行的特定字段 我有 this state post id 0 author Duffy Duck delay 1 p
  • 使用 RTC 源代码管理获取已更改文件的文件名、位置和作者

    我正在尝试访问给定流的已更改文件的文件名 位置和作者 下面的代码是我到目前为止所拥有的 看看api文档 这似乎不可能 这可以使用 java api 或其他方法来实现吗 IChangeSetSearchCriteria c IChangeSe
  • 在 C# 中定义操作系统版本

    我有一个问题 我找不到在编译时检测 Windows 版本的方法 我的目的是创建一个依赖于接口的可执行文件 该接口仅在特定版本的Windows中定义 因此 为了制作可执行的跨 Windows 版本 我希望能够为特定 Windows 版本定义包
  • Python while 循环中的准确睡眠/延迟

    我有一个 while True 循环 它将变量发送到外部函数 然后使用返回的值 该发送 接收过程具有用户可配置的频率 该频率是从外部 ini 配置文件中保存和读取的 我尝试过 time sleep 1 Frequency 但考虑到其他地方使