2015-07-21 40 views
-1

我有這個下面的代碼和我陷在while循環的Python .datetime.datetimenow()和datetime.timedelta()

我知道有與while datetime.datetime.now() < (datetime.datetime.now() + datetime.timedelta(minutes=wait_time)):線有問題。

任何人都可以幫忙嗎?

nodes_with_scanner = [] 
    wait_time = 60 
    while datetime.datetime.now() < (datetime.datetime.now() + datetime.timedelta(minutes=wait_time)): 
     nodes_with_scanner = get_nodes_with_scanner_in_dps(self.node_names, scanner_id, username=self.users[0].username) 
     log.logger.debug("Number of pre-defined {0} scanners detected in DPS: {1}/{2}".format(scanner_type, len(nodes_with_scanner), len(self.node_names))) 

     if state == "create": 
      if len(self.node_names) == len(nodes_with_scanner): 
       log.logger.debug("All {0} pre-defined scanners with id '{1}' have been successfully created in DPS for nodes '{2}'".format(scanner_type, scanner_id, ", ".join(self.node_names))) 
       return 
     elif state == "delete": 
      if len(nodes_with_scanner) < 1: 
       log.logger.debug("All {0} pre-defined scanners with id '{1}' have been successfully deleted in DPS for nodes '{2}'".format(scanner_type, scanner_id, ", ".join(self.node_names))) 
       return 
     log.logger.debug("Still waiting on some {0} pre-defined scanners to '{1}' in DPS; sleeping for 1 minute before next check".format(scanner_type, state)) 
     time.sleep(60) 
+1

Eve只要你一次性調用它,'datetime.datetime.now()+ datetime.timedelta(minutes = wait_time)'英寸到未來。 – NightShadeQueen

+1

另外,你碰巧在其他地方使用'datetime'嗎?因爲,說實話,你可以在這裏使用'time.time()'。 – NightShadeQueen

+0

你被困在while循環中'datetime.datetime.now()'將總是小於'(datetime.datetime.now()+ datetime.timedelta(minutes = wait_time))''。 –

回答

2

你問如果當前時間當前時間加上增量較小。當然,每一次都是如此,未來總是會走向未來。

記錄的開始時間一旦

start = datetime.datetime.now() 
while datetime.datetime.now() < start + datetime.timedelta(minutes=wait_time)): 

如果wait_time不會在循環變化,存儲結束時間(當前時間+δ):

end = datetime.datetime.now() + datetime.timedelta(minutes=wait_time)) 
while datetime.datetime.now() < end: 

這可能是更容易在這裏使用time.time()

end = time.time() + 60 * wait_time 
while time.time() < end: 
+0

非常感謝。簡直不敢相信我沒有注意到這一點。再次感謝。 – Dante

+0

1.基於datetime.now()的解決方案可能會在DST轉換期間失敗,例如由於北半球秋季的「倒退」。查看[查找是否在日期時間之間經過了24小時 - Python](http://stackoverflow.com/q/26313520/4279)2.'time.time()'可能由於計算機時鐘調整而失敗(跳轉可能很大一個VM)。 'time.monotonic()'可以用於某些使用情況。 – jfs

+0

@JFSebastian:是的,'time.monotonic()'不會祈禱時間調整,但僅適用於Python 3. –

1

你在你的while循環使用datetime.datetime.now(),拿什麼每次迭代,你是否現在時間是較低的,則現在時間+增量。

這在邏輯上是錯誤的,因爲它永遠是真的,因爲現在的時間將總是低於現在的時間加上增量。

你應該把它改成這樣:

time_to_start = datetime.datetime.now() 
while datetime.datetime.now() < (time_to_start + datetime.timedelta(minutes=wait_time)): 
    print "do something"