【发布时间】:2017-08-15 13:46:05
【问题描述】:
我正在编写一个应用程序,以从类似树莓派的计算机中输出假的MSF signal,以将无线电时钟与 NTP 服务器同步。该应用程序是用 python 编写的,我可以控制我计划用于输出信号的引脚,但我需要将 python 脚本与系统时钟同步。我已经找到了如何在相对准确的时间段内睡眠,但我还没有找到任何可以让我在指定的系统时间(例如下一分钟开始)以合理的准确度(在 100 毫秒左右)触发功能的方法)
【问题讨论】:
我正在编写一个应用程序,以从类似树莓派的计算机中输出假的MSF signal,以将无线电时钟与 NTP 服务器同步。该应用程序是用 python 编写的,我可以控制我计划用于输出信号的引脚,但我需要将 python 脚本与系统时钟同步。我已经找到了如何在相对准确的时间段内睡眠,但我还没有找到任何可以让我在指定的系统时间(例如下一分钟开始)以合理的准确度(在 100 毫秒左右)触发功能的方法)
【问题讨论】:
因为这是一个异步调用(独立于程序在其余时间所做的事情,我会使用asyncio 的AbstractEventLoop.call_at 来完成它与系统时钟同步。如果您获得所需的精度取决于在系统时钟上,但在我在 Linux 下运行的机器上,它通常具有几毫秒内的精度(不过,我还没有在 Raspberry Pi 上测试过)。一个简单的 Python 3 示例如下所示:
import asyncio
import datetime
import time
def callback(loop):
print('Hello World!')
loop.stop() # Added to make program terminate after demo
event_loop = asyncio.get_event_loop()
execution_time = datetime.datetime(2017,8,16,13,37).timestamp()
# Adjust system time to loop clock
execution_time_loop = execution_time - (time.time() - event_loop.time())
# Register callback
event_loop.call_at(execution_time_loop, callback, event_loop)
try:
print('Entering event loop')
event_loop.run_forever()
finally:
print('Closing event loop')
event_loop.close()
这个例子应该写成'Hello, World!'世界标准时间 2017 年 8 月 16 日 13:37。请注意,事件循环内的时间不是系统时间,因此您需要在事件循环时间中表示所需的执行时间。要让程序在任务执行后不停止,请删除回调末尾的loop.stop()。
【讨论】: