2017-02-11 2 views
1

time.sleep() 관련 스레드를 중단했지만 지연되었지만 아직 답을 찾지 못했습니다. 그러므로 내가 보는 이슈에 질문을 게시하십시오.python time.sleep이 예상보다 오래 걸립니다. (멀티 스레드)

전체 코드에 액세스 할 수 없습니다.

def my_debug(self, msg): 
    logging.debug(msg, extra={'threadname':threading.currentThread().name}) 

while True: 
    next = time.time() + INTERVAL # INTERVAL = 5 
    my_debug("Triggering event") 
    # some code 
    # some more code 
    sleep_time = max(next - time.time(), 0) 
    my_debug("Sleeping for %d sec" % sleep_time) 
    time.sleep(sleep_time) 

이 생산 :

2017-01-11 00:08:03 DEBUG MainThread Sleeping for 4 sec 
2017-01-11 00:08:21 DEBUG MainThread Triggering event 

는 분명히 다른 스레드가 및 while 루프가 MainThread에서 실행 저는 여기에 대한 액세스를했고 문제를보고하고있는 코드입니다. time.sleep은 4 초 동안 잠자기 상태에있게되는 반면 18 초 동안 기다리는 것으로 끝납니다.

이 문제를 일으킬 수있는 이유와 시나리오를 찾고 있습니다.

모든 도움말/포인터는 정말 감사하겠습니다.

답변

1

이 가공 된 예제는 결과를 재현 할 수 있습니다. 다른 스레드는 계산하고 인쇄하는 사이에 글로벌 sleep_time을 변경합니다. thread.log

import logging 
import time 
import threading 


INTERVAL = 5 

logging.basicConfig(filename='thread.log',level=logging.DEBUG, 
        format='%(asctime)s %(message)s') 

def my_debug(msg): 
    logging.debug(msg, extra={'threadname':threading.currentThread().name}) 


class Changer(threading.Thread): 

    def run(self): 
     global sleep_time 
     while True: 
      sleep_time = 18 


changer = Changer() 
changer.start() 


while True: 
    next = time.time() + INTERVAL # INTERVAL = 5 
    my_debug("Triggering event") 
    # some code 
    # some more code 
    sleep_time = max(next - time.time(), 0) 
    my_debug("Sleeping for %f sec" % sleep_time) 
    time.sleep(sleep_time) 

내용 : I 출력 거의 1 초 손실을 방지하기 위해 float로서 대기를 포맷

2017-02-11 19:45:14,700 Triggering event 
2017-02-11 19:45:14,701 Sleeping for 4.999720 sec 
2017-02-11 19:45:32,705 Triggering event 
2017-02-11 19:45:32,705 Sleeping for 4.999525 sec 
2017-02-11 19:45:50,710 Triggering event 
2017-02-11 19:45:50,710 Sleeping for 4.999726 sec 
2017-02-11 19:46:08,714 Triggering event 
2017-02-11 19:46:08,716 Sleeping for 4.997533 sec 
2017-02-11 19:46:26,720 Triggering event 
2017-02-11 19:46:26,725 Sleeping for 4.995042 sec 
2017-02-11 19:46:44,730 Triggering event 
2017-02-11 19:46:44,731 Sleeping for 4.999471 sec 
2017-02-11 19:46:49,730 Triggering event 
2017-02-11 19:46:49,731 Sleeping for 4.999794 sec 
2017-02-11 19:47:07,736 Triggering event 
2017-02-11 19:47:07,736 Sleeping for 4.999609 sec 
2017-02-11 19:47:25,739 Triggering event 
2017-02-11 19:47:25,739 Sleeping for 4.999751 sec 

주에는 잠금이 없습니다.

+0

코드가 이미 실행되었을 것입니다. 로그를 보면 두 로그 라인이 연속적이며 (마지막 라인의 루프와 두 번째 루프 라인) 잠시 사이에 잠 들어 있습니다. – Sharad

+0

로그 파일을 몇 줄 더 추가 할 수 있습니까? –

+0

나는 (내가 제한된 접근을 언급했듯이) 지금은 그것을 가지고 있지 않습니다. 좀 더 자세한 정보를 수집하려고합니다. – Sharad

관련 문제