[EXT-013][실무] 시각이 바뀌어도 시간 제한 정확히 재기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[EXT-013][실무] 시각이 바뀌어도 시간 제한 정확히 재기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 10회 작성일 26-09-08 03:34

본문

[이번 수업]
작업 시작과 끝에 현재 시각을 읽어 빼면 컴퓨터 시각이 보정될 때 경과 시간이 줄거나 뛰어오를 수 있습니다. 이번에는 단조 시계(monotonic clock, 실행 중 값이 뒤로 가지 않는 시간원)를 사용해 타임아웃과 마감 시간을 안전하게 계산합니다.

[선수지식]
초와 밀리초 단위, 함수, 조건문을 알고 Python 파일을 실행할 수 있으면 됩니다. NET-011의 타임아웃과 재시도 개념을 알면 좋습니다.

[학습목표]
1. 벽시계와 단조 시계의 용도를 구분한다.
2. 시작 시각이 아닌 절대 마감점을 한 번 계산한다.
3. 남은 시간을 0 이상으로 제한해 다음 작업에 전달한다.

[핵심개념]
벽시계(wall clock)는 달력의 날짜와 시각을 나타냅니다. 로그, 사용자에게 보여 줄 시각, 여러 시스템이 공유할 UTC 타임스탬프에 필요합니다. 하지만 네트워크 시각 동기화, 관리자의 변경, 가상환경 보정 때문에 값이 앞으로나 뒤로 조정될 수 있어 한 프로세스 안의 경과 시간 측정에는 적합하지 않습니다.

단조 시계는 기준점이 임의이므로 `1970년부터 몇 초` 같은 날짜로 바꿀 수 없지만, 같은 시계에서 읽은 두 값의 차이는 경과 시간에 쓸 수 있습니다. Python의 `time.monotonic()`은 뒤로 가지 않으며 시스템마다 해상도는 다를 수 있습니다. 값을 데이터베이스에 저장하거나 다른 컴퓨터와 비교하지 말고 현재 실행 안에서만 사용합니다.

여러 단계를 묶은 제한 시간은 `deadline = monotonic() + timeout`처럼 마감점을 한 번 정합니다. 각 단계 직전에 `deadline - monotonic()`으로 남은 시간을 구하고 음수면 0으로 고정합니다. 단계마다 처음의 전체 시간을 다시 주면 DNS, 연결, 재시도마다 시간이 새로 시작되어 전체 제한을 넘을 수 있습니다. 운영체제 대기 함수가 요청한 시각보다 늦게 깨어날 수 있으므로 마감 뒤에는 시계를 다시 읽어 판정합니다.

벽시계와 단조 시계를 섞어 빼면 단위가 초로 같아도 기준점이 달라 의미가 없습니다. 프로세스 재시작 뒤에도 유지해야 하는 만료 시각은 UTC 절대 시각으로 저장하고, 실행 중 대기와 타임아웃은 그 시점에 계산한 단조 마감점으로 관리합니다.

[따라하기]
아래를 deadline_demo.py로 저장합니다. 외부 패키지나 네트워크는 필요하지 않습니다.

```python
import time

timeout = 0.05
deadline = time.monotonic() + timeout
time.sleep(0.06)
remaining = max(0.0, deadline - time.monotonic())

print("만료됨:", remaining == 0.0)
print("남은 밀리초:", int(remaining * 1000))
```

macOS/Linux는 `python3 deadline_demo.py`, Windows는 `py deadline_demo.py`로 실행합니다. 예상 결과입니다.

```text
만료됨: True
남은 밀리초: 0
```

`time.sleep()`은 최소 대기 뒤 스케줄링 상황에 따라 더 늦게 돌아올 수 있습니다. 예제는 실제 남은 시간을 다시 계산하므로 늦게 깨어나도 음수가 전달되지 않습니다. 테스트에서는 시계 함수를 인자로 받아 가짜 값을 넣으면 오래 기다리지 않고 경계 조건을 재현할 수 있습니다.

[흔한 실수]
`time.time()`의 앞뒤 값을 빼서 타임아웃을 재거나, 단조 시계 값을 로그 날짜로 저장하면 안 됩니다. 초와 밀리초를 섞어 1000배 차이를 만드는 실수도 흔합니다. 반복문이 한 번 끝날 때마다 전체 제한 시간을 새로 부여하거나 `remaining`이 음수인 채 라이브러리에 전달되지 않도록 주의하세요.

[보안 주의]
본인 소유의 로컬·격리 환경에서만 실습하세요. 사용자가 보낸 제한 시간을 그대로 받아 무한 대기하지 말고 서버가 정한 최소·최대 범위로 제한합니다. 외부 호출에는 단계별 제한과 전체 마감점을 함께 두어 자원 고갈을 줄입니다. 인증 토큰 만료는 검증된 라이브러리와 서버의 신뢰 가능한 UTC 시각으로 확인하며 클라이언트 시각을 믿지 않습니다.

[직접 해볼 과제]
`remaining_seconds(deadline, clock=time.monotonic)` 함수를 만들어 남은 시간을 0 이상으로 반환하세요. 이어 가짜 시계가 10.0, 10.4, 10.7을 반환하게 해 마감점 10.5 전후의 결과를 대기 없이 테스트하고, 밀리초 입력을 초로 바꾸는 위치를 한 곳으로 정하세요.

[확인문제]
1. 경과 시간 측정에 벽시계보다 단조 시계가 알맞은 이유는 무엇입니까?
2. 여러 단계에서 마감점을 한 번만 계산해야 하는 이유는 무엇입니까?
3. 단조 시계 값을 다른 컴퓨터와 비교하면 안 되는 이유는 무엇입니까?

[다음 학습]
다음에는 여러 작업이 같은 파일을 동시에 바꾸지 못하게 원자적 교체와 잠금으로 안전하게 저장하는 방법을 배웁니다.

[공식 참고 자료]
- Python time.monotonic 공식 문서: https://docs.python.org/3/library/time.html#time.monotonic
- POSIX clock_gettime 명세: https://pubs.opengroup.org/onlinepubs/9799919799/functions/clock_gettime.html
- Go 단조 시계 문서: https://pkg.go.dev/time#hdr-Monotonic_Clocks
- Rust Instant 공식 문서: https://doc.rust-lang.org/std/time/struct.Instant.html
- W3C High Resolution Time Level 3: https://www.w3.org/TR/hr-time-3/

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
4,587
어제
6,862
최대
16,772
전체
770,538
Copyright © 소유하신 도메인. All rights reserved.