我只是在学习Python。出于某种奇怪的冲动,我正在尝试创建一个十进制时钟。这个十进制时钟将一天分为每天 10 小时、每小时 100 分钟、每分钟 100 秒。十进制的一天有 100,000 秒;86,400 在“古老”时间。每 1 秒的古代时间等于约 1.157 秒的新改进的十进制时间(假设我已经得到了一点数学正确。)
我遇到的问题是,为了让时钟准确而有序地记下小数秒,我需要一个函数尽可能每 1.157 秒触发一次。我有一个调用函数,DeciTimeCaller
它无限循环,调用该decimaltime.time_to_string
方法,该方法将古代时间转换为十进制时间,并以十进制小时:分钟:秒打印时间。调用函数然后休眠,time.sleep(1.157)
并完成它。
但是由于后台进程优先(我假设),打印时间在这里和那里跳过几秒钟。
例如,这是大约 20 秒的输出:
0:85:92
0:85:93
0:85:95
0:85:96
0:85:97
0:85:99
0:86:00
0:86:01
0:86:03
0:86:04
0:86:05
0:86:07
0:86:08
我认识到 Python 和 Linux 不构成实时系统,我在其他线程中尝试了一些建议,例如Sleep for exact time in python,但没有成功。但我想可能有一些方法可以捏造这个。
所以问题是:我能让这个时钟像钟表一样运转吗?
我的代码如下。需要注意的几件事:我导入线程模块是因为我试图使用事件,但我目前没有使用它。我使用十进制模块,因为我认为转换中浮点值的精度可能存在问题。似乎没有任何区别。我也有 timeit 模块和一些注释代码,我一直在尝试对调用计时。
import time
import datetime as dt
import decimal
import threading
import timeit
class decimaltime:
""" Presents the time of day in Decimal Time
10 Hours/day
100 minutes/hour
100 seconds/minute
"""
def time(self, archaic_seconds = 0):
if archaic_seconds == 0:
now = decimal.Decimal(dt.datetime.now().strftime('%s.%f'))
midnight = decimal.Decimal(dt.date.today().strftime('%s.%f'))
archaic_seconds_from_midnight = decimal.Decimal(now - midnight)
else:
archaic_seconds_from_midnight = decimal.Decimal(archaic_seconds)
return archaic_seconds_from_midnight * decimal.Decimal('1.157')
def time_to_string(self, decimal_seconds = 0):
if decimal_seconds == 0:
seconds_from_midnight = self.time()
else:
seconds_from_midnight = decimal.Decimal(decimal_seconds)
decimal_hour = seconds_from_midnight / 10000
decimal_minute = (seconds_from_midnight % 10000) / 100
decimal_second = seconds_from_midnight % 100
time_string = "%(hour)01d:%(minute)02d:%(second)02d" % {"hour": decimal_hour, "minute": decimal_minute, "second": decimal_second}
print time_string
# return time_string
def DeciTimeCaller():
decitime = decimaltime()
# t = timeit.Timer(lambda: decitime.time_to_string())
while True:
# print t.timeit(1)
decitime.time_to_string()
time.sleep(1.157)
DeciTimeCaller()
更新:
根据 Thomas 下面的建议,我修改了代码以每 1/10 秒检查一次十进制时间。如果十进制时间改变了,我打印出时间。这就像发条一样,这正是我想要的。
这是修改后的DeciTimeCaller
功能:
def DeciTimeCaller():
decitime = decimaltime()
old_time = decitime.time_to_string()
while True:
new_time = decitime.time_to_string()
if (new_time != old_time):
print new_time
old_time = new_time
time.sleep(.1667)