다음과 같이 부동 소수점 수를 줄 수 있습니다.
time.sleep(0.5)
하지만 얼마나 정확합니까? 내가 주면
time.sleep(0.05)
정말 50ms 정도 잠을 자겠습니까?
답변:
time.sleep 함수의 정확도는 기본 OS의 절전 정확도에 따라 다릅니다. 주식 Windows와 같은 비 실시간 OS의 경우 잠자기 가능한 최소 간격은 약 10-13ms입니다. 최소 10 ~ 13ms 이상일 때 몇 밀리 초 내에 정확한 수면을 보았습니다.
업데이트 : 아래 인용 된 문서에서 언급했듯이, 일찍 깨어 나면 다시 수면으로 돌아가도록 루프에서 수면을 취하는 것이 일반적입니다.
또한 Ubuntu를 실행하는 경우 rt 커널 패키지 (최소한 Ubuntu 10.04 LTS에서)를 설치하여 의사 실시간 커널 (RT_PREEMPT 패치 세트 포함)을 사용해 볼 수 있습니다.
편집 : 수정 비 실시간 Linux 커널은 최소 절전 간격이 1ms에서 10ms에 훨씬 가깝지만 결정적이지 않은 방식으로 다릅니다.
sleep()
문서에서 더 중요한 작업을 수행하는 경우 OS가 Windows와 Linux에서 수행하는 작업에 따라 달라집니다. "일시 중지 시간은 일정으로 인해 요청한 것보다 더 길 수 있습니다. 시스템의 다른 활동 ".
사람들은 운영 체제와 커널의 차이점에 대해 매우 옳지 만 우분투에서는 세분화가 보이지 않으며 MS7에서는 1ms 세분화가 표시됩니다. 다른 틱 속도뿐만 아니라 time.sleep의 다른 구현을 제안합니다. 자세히 살펴보면 우분투에서 1μs 세분성을 제안하지만 정확도를 측정하는 데 사용하는 time.time 함수 때문입니다.
로부터 문서 :
반면에
time()
및 의 정밀도는sleep()
해당하는 Unix보다 낫습니다. 시간은 부동 소수점 숫자로 표현되고time()
사용 가능한 가장 정확한 시간을 반환하며 (사용gettimeofday
가능한 경우 Unix 사용)sleep()
0이 아닌 분수가있는 시간을 허용합니다 (Unixselect
가 사용됨). 가능한 경우이를 구현하기 위해).
그리고 더 구체적으로 wrt sleep()
:
주어진 시간 (초) 동안 실행을 일시 중지합니다. 인수는보다 정확한 수면 시간을 나타내는 부동 소수점 숫자 일 수 있습니다. 포착 된 신호는 해당 신호의 포착 루틴의 다음 실행을 종료하기 때문에 실제 중단 시간 은 요청 된 시간 보다 짧을 수 있습니다
sleep()
. 또한 시스템에서 다른 활동의 스케줄링으로 인해 일시 중단 시간 이 임의의 양으로 요청 된 것보다 길 수 있습니다 .
다음은 Wilbert의 대답에 대한 내 후속 조치입니다. 아직 많이 언급되지 않았기 때문에 Mac OS X Yosemite도 마찬가지입니다.
요청한 시간의 약 1.25 배, 때로는 요청한 시간의 1 배에서 1.25 배 사이의 수면 시간이 많은 것 같습니다. 요청한 시간의 1.25 배 이상 잠들지 않습니다 (1000 개 샘플 중 두 배).
또한 (명시 적으로 표시되지 않음) 1.25 관계는 약 0.2ms 이하로 내려갈 때까지 꽤 잘 유지되는 것 같습니다. 또한 실제 시간은 요청한 시간이 20ms 이상이되면 요청한 것보다 약 5ms 더 길어집니다.
다시 말하지만, sleep()
OS X에서 Windows 또는 Linux 커널 Wilbert가 사용하던 것과는 완전히 다른 구현으로 보입니다 .
왜 알아 내지 않습니까?
from datetime import datetime
import time
def check_sleep(amount):
start = datetime.now()
time.sleep(amount)
end = datetime.now()
delta = end-start
return delta.seconds + delta.microseconds/1000000.
error = sum(abs(check_sleep(0.050)-0.050) for i in xrange(100))*10
print "Average error is %0.2fms" % error
기록을 위해 HTPC에서 약 0.1ms 오류가 발생하고 랩톱에서 2ms가 발생합니다.
당신이 말한 한 최소한 수면에 최선을 다할 것이라는 점을 제외하고는 sleep ()에 대해 어떤 것도 보장 할 수 없습니다 (신호는 시간이되기 전에 수면을 죽일 수 있으며 더 많은 것들이 그것을 실행시킬 수 있습니다 긴).
표준 데스크톱 운영 체제에서 얻을 수있는 최소값은 약 16ms (타이머 세분성 + 컨텍스트 전환 시간)가 될 것이지만, 시도 할 때 제공된 인수의 % 편차가 중요 할 가능성이 있습니다. 10 초 동안 잠자기 위해.
시그널, GIL을 보유한 다른 스레드, 커널 스케줄링 재미, 프로세서 속도 스테핑 등은 스레드 / 프로세스가 실제로 휴면하는 기간에 혼란을 일으킬 수 있습니다.
def start(self):
sec_arg = 10.0
cptr = 0
time_start = time.time()
time_init = time.time()
while True:
cptr += 1
time_start = time.time()
time.sleep(((time_init + (sec_arg * cptr)) - time_start ))
# AND YOUR CODE .......
t00 = threading.Thread(name='thread_request', target=self.send_request, args=([]))
t00.start()
sleep ()의 인수를 전달하기 위해 변수를 사용하지 마십시오. 계산을 sleep ()에 직접 삽입해야합니다.
그리고 내 터미널의 귀환
1 ───── 17 : 20 : 16.891 ───────────────────
2 ───── 17 : 20 : 18.891 ───────────────────
3 ───── 17 : 20 : 20.891 ──────────────────
4 ───── 17 : 20 : 22.891 ──────────────────
5 ───── 17 : 20 : 24.891 ───────────────────
....
689 ─── 17 : 43 : 12.891 ────────────────────
690 ─── 17 : 43 : 14.890 ───────────────────
691 ─── 17 : 43 : 16.891 ───────────────────
692 ─── 17 : 43 : 18.890 ───────────────────
693 ─── 17 : 43 : 20.891 ───────────────────
...
727 ─── 17 : 44 : 28.891 ────────────────────
728 ─── 17 : 44 : 30.891 ────────────────────
729 ─── 17 : 44 : 32.891 ───────────────────
730 ─── 17 : 44 : 34.890 ───────────────────
731 ─── 17 : 44 : 36.891 ───────────────────