我如何使程序每次以秒为单位的时间戳为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秒
答案 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()