2014-07-20 4 views
0

가상 시스템에서 일부 실험을 실행 중입니다. 일시 중지 된 경우 시스템 시간이 업데이트됩니다. 가상 컴퓨터를 일시 중단하고 타이머에 영향을주지 않는지 알고 싶습니다. 즉, Timer는 시스템 시간 또는 벽 시간을 사용합니까?어떻게 파이썬 threading.Timer 경과 시간을 결정합니까?

나는 소스 코드를 찾고 시도하고 코드가 C.

에 딥 전에 다음은 내 코드가 _thread.lock.acquire에 도착. 나는 '계획'을 출력하는 하위 프로세스에 위임합니다. 최적의 계획이 발견되거나 최대 허용 시간이 경과 할 때까지 이러한 계획을 수집합니다. 타이머는 시간이 다되면 프로세스를 종료하는 데 사용됩니다 (예상되는 상태 임). Timer은 실행중인 실험을 무효화하므로 업데이트되는 시스템 시간에 영향을받지 않습니다. * 유닉스 IT 시스템에 대한 파이썬 소스 코드의 검사시

p = Popen(args, stdout=PIPE, cwd=self.working_directory) 
timer = Timer(float(self.planning_time), p.terminate) 
timer.start() 

plan = None 
while True: 
    try: 
     plan = list(decode_plan_from_optic(self.decode(p.stdout), 
        report_incomplete_plan=True)) 
    except IncompletePlanException: 
     break 
timer.cancel() 
+1

나는 파이썬이 어떤 보증도 제공하지 않는다고 확신한다. 단순히 C 레벨 시스템 호출을 사용하기 때문에 문서가 어떻게 보이는지 살펴야한다. ('Timer'는 내부적으로'Lock'을 생성하고'acquire' 메소드를 호출하는'Condition' 객체를 사용하여 구현되므로 시스템 호출의 보장을 확인하여 OS에서 잠금을 획득해야합니다. – Bakuriu

+0

@Bakuriu 감사합니다. 소스를 확인하고'thread_pthread.h '에서 대답을 발견했습니다. 그것은 파이썬 대기가 시스템 시간에 의존하는 것으로 밝혀졌습니다. – Dunes

답변

1

, 나는 지원에 따라 pthread.h에서 semaphore.h 또는 pthread_cond_timedwait에서 sem_timedwait에 결국 대표를 그 파이썬을 발견했다. 어느 쪽이든, 두 함수는 에서 struct timespec을 취할 때까지 대기하는 절대 시간으로 - timespec은 초와 초의 시간 (나노초)입니다.

그래서 파이썬에서 기다리는 것이 시스템 시간에 달려있는 것 같습니다. 즉, 프로그램이 시스템 시간의 변화에 ​​영향을 받는다는 것을 의미합니다. 그러나 time.h은 단조 증가 클럭이 필요한 경우 CLOCK_MONOTONIC_RAW 상수와 clock_gettime 함수를 지정합니다. 시스템 시간과 독립적으로 대기 할 수있는 기능이 있음을 나타냅니다. 그러나 슬프게도 파이썬은 시스템 시간의 변경에 영향을받는 gettimeofday (2008 년 이후로 폐기 됨)을 사용합니다. 간단히 말해, * 유닉스 시스템에서 파이썬으로 대기하는 것은 시스템 시간을 변경함으로써 이루어진다.

관련 문제