2009-11-12 3 views
1

예를 들어, time.sleep (100)을 수행하고 컴퓨터를 99 초 동안 최대 절전 모드로 전환하면 다음에 나오는 명령문이 깨어 난 후 1 초 또는 100 초 후에 실행됩니까? 쪽으로?time.sleep and suspend (예 : 대기 및 최대 절전 모드)

응답이 1 초인 경우 최대 절전 모드/대기 모드의 길이에 관계없이 100 초 동안 "절전 모드"로 전환하는 방법은 무엇입니까?

답변

5

time.sleep(N) 시도 적어도 N 경과, AKA "벽 시계"시간의 초 잠을 예를 들어 스레드는 그 시점에 다시 실행할 준비가되지만, 그 시점에 실행중인 다른 스레드가 선점 한 것은 아닙니다. 즉, 프로그래밍 언어가 아닌 운영 체제의 결정입니다. 반면에 수면은 여러 종류의 사건 (예 : 인터럽트)에 의해 조기에 중단 될 수 있습니다.

운영체제에서 시스템의 상태가 자신이 관심을 가질 때만 진행되는 시계 같은 물건을 찾을 수 있다면 (예 : "hybernated"가 아닌 경우), 물론 다시 돌아갈 수 있습니다 당신이 "너무 일찍"다시 일어나면 잠이 든다.

예를 들어, Windows 7에서 QueryUnbiasedInterruptTime은 "시스템이 절전 모드 또는 최대 절전 모드에있는 시간을 포함하지 말고"100 나노초 단위를 사용하도록 특별히 문서화되어 있습니다. 그래서 전화하면 ctypes을 통해, 당신은 효과를 얻을 수 있습니다 당신이 원하는 :

def unbiasedsleep(n): 
    start = kernel32.QueryUnbiasedInterruptTime() 
    target = start + n * 10 * 1000 * 1000 
    while True: 
    timeleft = target - kernel32.QueryUnbiasedInterruptTime() 
    if timeleft > 0: 
     time.sleep(timeleft/(10 * 1000 * 1000.0)) 

내가 Windows 또는 다른 운영 체제의 다른 버전에 QueryUnbiasedInterruptTime의 동등한를 얻는 방법을 모른다, 그러나, 당신은 우리에게 말하지 않는 것 당신이 관심을 가지고있는 운영체제가 있다면, 어쨌든 서로 다른 환경에서 유사하게 작동 할 수있는 긴 세탁 목록을 제시하는 것은 무의미 할 것입니다. 최대 절전 모드는 수면의 가치가 일초까지 사용 하듯이

1

분명히, 당신은 진짜, 경과 시간에 따라 자야합니다.

대체로 ("어떻게 든"시작하고 중지 한 다른 시계에 따라 잠자는) 관리하기 어려울 수 있습니다. 잠자고있는 귀하의 신청서에이 모든 시작 및 중지 활동에 대해 어떻게 통보합니까? 시스템이 최대 절전 모드 상태이므로 실행하지 않아야한다는 말을 듣기 위해서는 깨어나야합니다.

또는 수퍼 정교한 OS 레벨 스케줄러를 사용하여 시스템이 "사용 중"이었던 시간과 "최대 절전 모드"가 다양한 수면 프로세스의 일정과 비교하여 계산되었는지 확인할 수 있습니다.

너무 복잡합니다.

사실, 신중하게 확인하면 잠자기가 거의 끝나고 모든 유닉스 신호가 중단됩니다. 그래서 여러 가지 이유로 일찍 일어날 수 있습니다. Control-C가 큰 예입니다. ; 잠이 정확히 N 초 지속될 것이라는 보장이 없을 수 물론 -

3
당신이 달성하기 위해 노력하고 정확히 모르는

하지만

for i in range(100):sleep(1) 

는 작동 할 수 있습니다