>source

아래 코드를 고려하십시오.

def set_ntp_time():
    times = []
    for address in ntp_addresses:
        ntp_client = ntplib.NTPClient()
        ntp_response = ntp_client.request(address, version=3)
        ntp_time = datetime.fromtimestamp(ntp_response.orig_time)
        fomatted_time = ntp_time.strftime("%H:%M:%S.%f")
        
        times.append(fomatted_time)
    
    global time
    time = min(times)
set_ntp_time()
print(time)

다음과 같이 밀리 초 단위로 몇 시간을 인쇄합니다.

21:02:23.2898

예를 들어 (08:30:00)시에 함수를 실행해야합니다. 그래서 내 질문은 스크립트를 실행할 때 시간을 한 번 얻지 만 스크립트가 08:30:00에 가장 가까운 시간까지 기다린 다음 함수를 실행하려면 어떻게 작성해야합니까?

나는 사용했다 schedule 모듈이지만 정확하지 않습니다. 그러니 다른 답변을주세요.

이 같은:

if (time === '08:30:00'):
    ...


  • 답변 # 1

    IMHO, 접근 방식은 간단합니다.

    NTP 시간 가져 오기 (전화 할게 now )

    코드를 실행할 시간을 정의하십시오 ( runat )

    차이 계산

    그 시간 동안 자

    그 때 원하는대로하세요

    NTP 서버에 시간을 요청하는 것은 시간이 걸립니다. 따라서 5 단계의 일부로 NTP 시간을 인쇄하면 항상 늦게 표시됩니다. 아래 코드에서이를 보완하기 위해 현지 시간을 사용하겠습니다.

    from time import sleep
    import ntplib
    from datetime import datetime
    
    def get_ntp_time() -> datetime:
        ntp_pool = ['0.pool.ntp.org', 'uk.pool.ntp.org', 'ie.pool.ntp.org']
        for item in ntp_pool:
            call = ntplib.NTPClient()
            response = call.request(item, version=3)
            try:
                t = datetime.fromtimestamp(response.orig_time)
                return t  # Use the time of the first NTP server that returns a time
            except:  # no response from server
                pass
    
    now = get_ntp_time()
    runat = datetime(now.year, now.month, now.day, now.hour, now.minute + 1, 0)  # Arbitrary, put 8:30 here
    print("NTP time:", now)
    print("Time to wait:", runat - now)
    sleep((runat - now).total_seconds())
    localbefore = datetime.now()
    print("Running the job ...")
    now = get_ntp_time()
    localafter = datetime.now()
    print("NTP time:", now)
    print("Job ran at: ", now - (localafter - localbefore))
    
    

    출력 예 :

    NTP time: 2021-01-05 15:43:21.772182
    Time to wait: 0:00:38.227818
    Running the job ...
    NTP time: 2021-01-05 15:44:00.031360
    Job ran at:  2021-01-05 15:44:00.010784
    
    

    Windows의 스레드 스케줄링은 1/64 초에 발생하므로 17ms보다 훨씬 더 가까워지지 않을 것입니다.

    
    time = min(times)
    
    

    작동하지 않습니다. 최소 시간이 너무 오래 전입니다. 루프의 시간을 모든 서버에 요청하면 시간이지나갑니다. 세 서버를 모두 요청하는 경우 최대 시간이 필요합니다.

  • 이전 python - 데이터 프레임을 병합하고 값을 채우는 방법
  • 다음 python - 플라스크 - 경로가 없지만 동일한 오류가 계속 발생합니다