2017-02-28 63 views
0

我需要每n秒運行一個進程。我認爲Threading.timer是最好的方法。但是當我運行我的命令時,它不會每隔n秒運行一次,但是會反覆運行,比給定的n少很多,並且循環不可停止。這是我的代碼:如何每n秒運行一次耗時的過程?

#!/usr/bin/python 

import threading 
import time 

brake = 10 
k = int(5) 

def printit(): 
    for x in range(k): 
     threading.Timer((int(brake)), printit).start() 
     print "Hello World!" 
     #i have a longer process here, it takes a few seconds to run 
     #i give more than double of the time needed to run it 
printit() 

所以我想要發生的是:它打印你好世界5次,每次之間10秒剎車。但相反,它打印速度更快,並且不會停止。 我是否缺少一些參數,或者是我嘗試運行的進程的問題?我也很感激任何其他更簡單的方法每隔n秒運行一次。

回答

1

雖然你似乎是使用python2.x(打印作爲關鍵字),因此睡眠是一個好主意,如果你正在使用py3.4起有ASYNCIO

import asyncio 

def do_task(end_time, loop): 
    print('hello world!') 
    if (loop.time() + 1.0) < end_time: 
     loop.call_later(1, do_task, end_time, loop) 
    else: 
     loop.stop() 

loop = asyncio.get_event_loop() 

end_time = loop.time() + 10.0 
loop.call_soon(do_task, end_time, loop) 

loop.run_forever() 
loop.close() 
0

您可以在Python

import time 

k = int(5) 

def printit(): 
    for x in range(k): 
     time.sleep(5) 
     print "Hello World!" 
     #i have a longer process here, it takes a few seconds to run 
     #i give more than double of the time needed to run it 
printit() 
+0

它很好,但正如我所提到的,我的過程需要幾秒鐘的時間才能運行,所以如果我運行它,它會等待5秒鐘,我的過程(需要多少時間),所以下次啓動時間爲5秒+運行流程花費的時間。 – TheAdam122

0

你真的要暫停10秒,只是time做到這一點。

time.sleep(brake) 

如果你確實想要一個計時器的方法來運行所有操作都必須在一個單獨的線程。您需要將打印功能與定時器功能分開。但是,這會打印出「Hello World!」經過10秒後,同時全部5次。

import threading 
import time 

brake = 10 
k = 5 

def printit(): 
    for x in range(k): 
     threading.Timer(brake, long_process, args=('Hello World!',)).start() 

def long_process(item): 
    print(item) 
    #i have a longer process here, it takes a few seconds to run 
    #i give more than double of the time needed to run it 


printit() 
0

感謝所有的答案,但在同時,我想通了,做最完美的方式:

import time 

a=2 
b=5 

for x in range(a): 
    start = time.time() 
    print "Hello World!" 
    time.sleep(3) 
    run = (-(start)+time.time()) 
    time.sleep(int(b)-(run)) 

它,我知道重複運行一個過程的每n秒的唯一途徑。只需使用time.sleep即可輕鬆完成,但如果您有更長的流程,則需要在流程運行時減少睡眠時間。