2

我只是在学习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)
4

1 回答 1

2

以精确的频率运行函数是相当困难的。

您可以创建一个函数,将当前系统时间转换为十进制时间 30 次/秒。这样你的时间总是正确的,你永远不会失去同步。

于 2013-03-15T07:41:44.450 回答