2011-03-01 152 views
2

例如,我有函數do_something(),我希望它運行正好1秒(而不是.923秒,但不會,但0.999是可以接受的。)如何在Python中的特定時間運行某個函數?

但是,它非常重要do_something必須正好運行1秒。我正在考慮使用UNIX時間戳並計算秒數。但我真的想知道Python是否有辦法以更美觀的方式做到這一點...

函數do_something()是長時間運行的,並且必須在一秒鐘後中斷。

+0

將它取不到一秒,總是和你需要墊呢?它會花費超過一秒鐘,你想減少它? – chmullig

+0

請澄清你的問題。你想(a)一次運行'do_something'一次,然後中斷它,或者(b)你想重複運行'do_something'直到1秒過去,或者(c)你想運行' do_something'重複,直到1秒鐘過去*和*中斷最近執行1秒鐘後通過? – phooji

+0

沒有do_something()函數只是做了一些事......但它只能做它只做了一秒的事情。如果它是1秒,它必須切斷它正在做的事情。 – JohnRoach

回答

1

這段代碼可能適合你。描述聽起來像你想要什麼:

http://programming-guides.com/python/timeout-a-function

它依賴蟒蛇signal模塊:

http://docs.python.org/library/signal.html

+0

注意:信號是隻有unix功能的。 – phooji

+0

實際上'signals'模塊不是unix-only,而是'SIGALRM'信號。但是,如果你在unix上,這將是一個完美的解決方案。特別是如果你不能控制'do_something'的內容。 – noio

+0

不幸的是,該網站的鏈接現在已被破壞 - 已被域名人質服務抓到:( – Henning

1

Python中的「附表」模塊出現適合:

http://docs.python.org/library/sched.html

除了:Python是不是實時的語言,也沒有通常在實時操作系統上運行。所以你的要求是有問題的。

+0

「Python不是一種實時語言」我知道我知道......當一種語言被強迫餵給我時,我會戴上它。這真的不是我的選擇。我會檢查sched。看起來很有希望。 – JohnRoach

+0

所以你說基本上我應該簡單地安排我的每一步的功能? – JohnRoach

2

我從收集的意見,有一個while循環在這裏的某個地方。根據threading模塊中_Timer的源代碼,此類是Thread的子類。我知道你說你決定不使用線程,但這只是一個計時器控制線程; do_something在主線程中執行。所以這應該是乾淨的。 (有人糾正我,如果我錯了!):

from threading import Thread, Event 

class BoolTimer(Thread): 
    """A boolean value that toggles after a specified number of seconds: 

    bt = BoolTimer(30.0, False) 
    bt.start() 
    bt.cancel() # prevent the booltimer from toggling if it is still waiting 
    """ 

    def __init__(self, interval, initial_state=True): 
     Thread.__init__(self) 
     self.interval = interval 
     self.state = initial_state 
     self.finished = Event() 

    def __nonzero__(self): 
     return bool(self.state) 

    def cancel(self): 
     """Stop BoolTimer if it hasn't toggled yet""" 
     self.finished.set() 

    def run(self): 
     self.finished.wait(self.interval) 
     if not self.finished.is_set(): 
      self.state = not self.state 
     self.finished.set() 

你可以使用這樣的。

import time 

def do_something(): 
    running = BoolTimer(1.0) 
    running.start() 
    while running: 
     print "running"    # Do something more useful here. 
     time.sleep(0.05)    # Do it more or less often. 
     if not running:    # If you want to interrupt the loop, 
      print "broke!"   # add breakpoints. 
      break     # You could even put this in a 
     time.sleep(0.05)    # try, finally block. 

do_something() 
+0

哇!它看起來像我正在尋找的!其實是!謝謝! – JohnRoach

相關問題