2016-08-10 46 views
2

我想製作一個遊戲服務器,在一段時間後更新。如何使python適當的服務器打勾?

import time 
last_time = time.time() 
tick = 1 
time_since_last_update = 0 
while True: 
    new_time = time.time() 
    dt = new_time - last_time 
    time_since_last_update += dt 
    last_time = new_time 
    if time_since_last_update > tick: 
     print("Magic happens") 
     time_since_last_update = 0 

當我這樣做時,python在其中一個內核上消耗100%的計算能力。我不明白爲什麼會發生這種情況,如果可能的話如何解決這個問題。

+0

從我的理解是,你想每1秒後打印一次吧? – harshil9968

+0

這只是一個存根。我的想法是每秒更新一次,而不執行'time.sleep(1)' – Montreal

+0

如果你不這樣做,那麼這個循環將以100%的利用率運行,並繼續以微小的值遞增,直到它達到1。請讓核心運行如此艱難!這不公平。 – harshil9968

回答

3

插入一個time.sleep(0.01)在每次輪詢之間等待10毫秒,否則您的循環會持續輪詢時間,而不釋放CPU的電源。

編輯:這是更好的,只需要等待一次。如果發生巨大的CPU過載,等待的時間可能是負面的,在這種情況下,可以立即觸發2個動作。 不斷重新計算目標時間以避免浮動積累錯誤。

import time 
start_time = time.time() 
tick = 1.0 # 1 second 

tick_count = 0 

while True: 
    new_time = time.time() 
    tick_count += 1 
    targeted_time = start_time + tick*tick_count 

    time_to_wait = targeted_time - new_time 

    if time_to_wait>0: 
     time.sleep(time_to_wait) 
    print("Magic happens,waited %f seconds" % time_to_wait) 
+2

這比繁忙的循環更好,但它可能不是OP想要的。他們可能在尋找的是代碼,它將完成他們需要的所有內容,然後計算在下一個時間點到期之前需要多久才能入睡。 –

+0

你說得對。睡眠時間應該被預測,但這是相同的原理 –

+0

@WillKunkel它不完全是一個[busy loop](https://en.wikipedia.org/wiki/Busy_waiting),因爲python線程在time.sleep() '被調用。這允許其他進程(或線程)使用處理器時間。 – Aaron

相關問題