Python命令每45秒运行一次

时间:2018-12-05 00:01:40

标签: python python-3.x

我如何使程序每次以秒为单位的时间戳为45时都运行,当前我正在使用time.sleep,但是我的运行时间往往会在每次执行该程序时有所变化,我希望如果时间戳位于第45秒,请再次执行。目前,我有这样一个运行循环每60秒开始的东西,但是我希望它在timestamp seconds slot == 45

时运行循环
def run_loop(self):
    while True:
        sys.stdout.write("-----\n")
        sys.stdout.flush()

        start = time.time()
        self.takeProfit()
        self.place_orders()
        end = time.time()
        print("runtime is ", end - start)
        sleep(60)
def run():
    # Try/except just keeps ctrl-c from printing an ugly stacktrace
    ei = ExchangeInterface()
    try:
        ei.run_loop()
    except (KeyboardInterrupt, SystemExit):
        sys.exit()

ExchangeInterface.run()

此刻我的运行时间通常约为18-20秒

3 个答案:

答案 0 :(得分:1)

您可以使用datetime模块,并检查是否datetime.now().second == 45

例如

from datetime import datetime

if datetime.now().second == 45:
    do_stuff()

在您的情况下,如果我们处于第45秒,您将使用某种逻辑检查每X的时间。

答案 1 :(得分:0)

所以我假设您的意思是在每分钟的第45秒运行一个事件?

这听起来像是您要进行事件调度: https://docs.python.org/3/library/sched.html

在该页面上的示例中,他们仅使用调度程序的enter方法,而不是您应该使用的enterabs

为此,您需要计算从当前分钟起45秒的时间。一些简单的数学得出:

t = time.time()
minute = 60 * (t \\ 60) #Use integer division!
s.enterabs(minute + 45, ...)
s.run()

...中的内容指定了您要运行/计划的内容,只需阅读软件包文档即可确定格式。

然后只需将该调度放入循环中,一切都应该很好,并且不再需要sleep(60)

答案 2 :(得分:0)

您需要实现计划程序,该计划程序每45秒调用一次函数。

我们可以使用python的threading.Timer类来实现简单的调度程序:

class Scheduler(Timer):
    def __init__(self, func, args=None, kwargs=None, interval=60):
        super().__init__(interval, func, args=args, kwargs=kwargs)

    def run(self):
        while not self.finished.is_set():
           self.finished.wait(self.interval)
           self.function(*self.args, **self.kwargs)

def func(self):
    sys.stdout.write("-----\n")
    sys.stdout.flush()

    start = time.time()
    self.takeProfit()
    self.place_orders()
    end = time.time()
    print("runtime is ", end - start)

def run():
   # Try/except just keeps ctrl-c from printing an ugly stacktrace
   scheduler = Scheduler(func, interval=45)
   scheduler.start()
   try:
      while True:
         sleep(1) # just idle loop to demonstrate that how scheduler working
   except (KeyboardInterrupt, SystemExit):
      scheduler.cancel()
      sys.exit()

ExchangeInterface.run()