2016-08-10 2 views
2

일정 기간 후에 업데이트되는 게임 서버를 만들려고합니다.파이썬으로 올바른 서버 틱을 만드는 방법은 무엇입니까?

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 

이 작업을 수행 할 때 파이썬은 코어 중 하나에서 100 % 컴퓨팅 성능을 소비합니다. 나는 이것이 왜 일어나는 지, 가능한 경우 이것을 고치는 법을 정말로 이해하지 못한다.

+0

제가 이해하는 것은 1 초마다 인쇄하고 싶다는 것입니다. – harshil9968

+0

이것은 단지 하나의 스텁 일뿐입니다. 내 생각은'time.sleep (1)'을하지 않고 매초마다 업데이트를하는 것이다. – Montreal

+0

그렇게하지 않으면이 루프는 100 % 활용도에서 실행되고, 1에 도달 할 때까지 작은 값으로 증가한다. 그 핵심이 너무 열심히하게, 제발! 공정하지 않아. – harshil9968

답변

3

각 시간 사이에 10 밀리를 기다리려면 time.sleep(0.01)을 삽입하십시오. 그렇지 않으면 루프가 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'busyly loop '(https://en.wikipedia.org/wiki/Busy_waiting)가 아닙니다. 파이썬 스레드는'time.sleep() '라고합니다. 이렇게하면 다른 프로세스 (또는 스레드)가 프로세서 시간을 사용할 수 있습니다. – Aaron

관련 문제