Put a timer on a function inside while loop
关于它有很多问题,但我还不太明白。我必须将一些代码上传到服务器上才能全天候运行,而这些代码基本上是这样的:
1 2 3 4
| while True:
variable1 = function1()
variable2 = function2()
variable3 = function3() |
比如说,我想每小时做一次variable2 = function2(),以提高性能(我不太了解,但我认为在上面放一个计时器会更好)
我不能在上面使用time.sleep(),因为代码必须继续运行。我提到服务器这件事是因为我不知道使用系统计时器的答案是否适用,我仍在学习如何使用它。忘了说我用的是python 2.7
- 你在问穿线吗?
- @我不知道是什么,让我查一下
- 您想知道每个函数结束需要多长时间吗?
- @我不确定我明白…函数2不需要每小时运行100次,我只需要一次。但这段时间必须继续下去,所有的代码都在里面,所以我需要为那个单一的调用设置一个计时器。
- 如果您希望以不同的频率执行3个定期操作,请考虑将它们作为完全独立的进程运行,由cron实用程序调度(您会发现,在Python世界之外,它可以为您运行python脚本,就像它可以运行其他任何操作一样)。如果您必须在同一进程中拥有这些函数,那么听起来您需要在不同的线程中运行这三个函数。python可以通过threading模块为您处理这个问题。但是穿线是一个深奥的话题,有几个哥特人躺在那里等着不小心的人,所以就用谷歌搜索。
- @jez so,import threading and variable2=threading.timer(3600,function2)应该在运行时保持,但每小时只执行一次function2,对吗?
- @当然,征税是一种方式。但是请注意,variable2现在不是function2()的输出:而是计时器对象(顺便说一下,它也必须是.start()ed)。你对上面的keyvanvafee的评论让我觉得你也许能够摆脱一些简单的事情,因此我(完全非线程)的回答如下。实际上,每种方法的优缺点将归结为您需要对输出variable1、variable2等执行哪些进一步操作的细节。
- 更正:实际上我认为Timer在指定的延迟之后只运行一次函数。不要重复。另一种方法是启动一个threading.Thread对象,该对象的target是一个函数,它在自己的专用while循环中包含function2()调用。
- @Coldspeed标记为"复制"是错误的:OP不询问超时。
不确定这是否是您想要的,但是这里有一个循环,它运行三个具有三个不同周期的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import time
t1 = t2 = t3 = 0
period1 = 1.0 # do function1() every second
period2 = 3600.0 # do function2() every hour
period3 = 60.0 # do function3() every minute
sleep_seconds = 0.1 # or whatever makes sense
while True:
t = time.time()
if t - t1 >= period1:
variable1 = function1()
t1 = time.time()
if t - t2 >= period2:
variable2 = function2()
t2 = time.time()
if t - t3 >= period3:
variable3 = function3()
t3 = time.time()
time.sleep( sleep_seconds ) |
- 这可能有效。所以T随系统时间增加,是吗?如果它是从服务器上运行的(我真的不知道服务器如何工作),会有问题吗?
- time.time()返回了自1970年伦敦和约翰内斯堡香槟瓶塞出现以来经过的秒数。唯一我能预见到问题的情况是,如果服务器的时钟由于某些奇怪的原因(例如,比它应该的时间提前几个小时)设置得非常错误,并且在运行时通过时间服务器进行自我修正。
- 那么它应该可以正常工作,这只是我保存一些请求的拙劣尝试。谢谢您!