2
votes

I am trying to make a game server which updates after a certain period.

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

When I do this thing, python consumes 100% computing power on one of the cores. I don't really understand why is this happening and how to fix this if possible.

1
from what I understand is that you want to print this after every 1 second right? - harshil9968
It's just a stub. My idea is to do updates each second without doing time.sleep(1) - Montreal
If you don't do that then this loop will run at the 100% utilization, and keep on incrementing with tiny values till it reaches 1. Don't make that core run so hard, please! it's not fair. - harshil9968
@harshil9968 that's why I'm asking this question. But again, time.sleep(1) is not an option. - Montreal
I don't think any other option will be as good as time.sleep(1), why do you want to something else can you explain? - harshil9968

1 Answers

3
votes

Insert a time.sleep(0.01) to wait 10 millis between each time poll otherwise your loop polls time continuously without releasing power to the cpu.

Edit: That is better, only waits once if needed. Should a huge CPU overload occur, the time to wait could be negative, and in that case 2 actions could be triggered at once. And targeted time is recomputed constantly to avoid float accumulation errors.

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)