2017-05-23 3 views
0

서버 측 스크립팅을위한 Python 인터프리터를 포함하는 HTTP 서버 (C++에서는 홈 메이드)를 실행하고 있습니다. 이것은 포크 서버이지만 부모 프로세스에서 스레딩을 사용하지 않습니다. 나는 파이썬 인터프리터 (포크 제외)로 이상한 일을하지 않는다.Python time.sleep이 훨씬 오래 걸림

그러나 스크립트 중 하나에서 다른 스레드에서는 time.sleep(0.1)에 대한 호출이 최대 1 분, 특히 첫 번째 호출까지 걸릴 수 있습니다.

while not self.should_stop(): 

    # other code 

    print "[PYTHON]: Sleeping" 
    time.sleep(0.1) 
    print "[PYTHON]: Slept, checking should_stop" 

나는이 훨씬 나중에, 더 로그가 첫 번째 인쇄를 표시하기 때문에, 매달려, 두 번째 어디에 것을 알고있다.

추가 정보 : CPU가 불렀고되지

  • (~ 5 %)
  • 이 이러한 threading 스레드입니다 우분투
  • 에 파이썬 2.7이다; 필요한 경우 잠금 장치 및 이벤트를 사용합니다.
  • 포크를 수행하는 모든 프로세스에서 threading을 가져 오지 않습니다.
  • 포크 전에 파이썬이 초기화됩니다. 이 때문에 하나 개의 스레드 수 많은 스레드가있는 경우 지속적으로 그들 사이를 전환 할 수, 인터프리터가있다, 그래서

답변

0

파이썬은 한 번에 only onethreading.Thread을 실행할 수있는 다른 곳 (최근 6 개월 동안 아무런 문제) 잘 작동하지 않습니다 다른 사람은 동결 동결하거나 다른 말로하면 중단됩니다.

하지만 인터럽트 된 스레드는 동결 상태라는 말을 듣지 못해 잠시 의식을 잃고 잠에서 깨어나고 은 중단 된 곳에서 작업을 계속합니다. 따라서 특정 스레드에 대해 0.5 초가 실제로 실제 시간보다 길어질 수 있습니다.

+0

안녕하세요! 죄송합니다. 근원을 제공해 주시겠습니까? 전에 이런 말을 들어 본 적이 없습니다. 감사! 편집 : 또한 2 개의 스레드 만 있는데 왜 그 중 하나가 정지합니까? –

+0

1 초 30 분을 기다리는 시간은 글로벌 인터프리터 잠금을 사용하는 경우에도 치명적인 스레드 예약 결함 일 수 있습니다. – user2357112

+0

@ user2357112, 나는 그것이 '과장'이 꽤 두드러 질 수 있다는 것을 보여주는 것이 과장이라는 것은 꽤 분명해야한다고 생각했습니다. – ForceBru

0

고정!

메인 스레드 (인터프리터를 C++에 임베드 한 스레드)는 파이썬 코드를 실행하지 않을 때 GIL을 실제로 릴리스하지 않습니다 (상상 한 것처럼). Py_BEGIN_ALLOW_THREADSPy_END_ALLOW_THREADS과 같이 실제로과 같이 GIL을 수동으로 릴리스해야합니다.

이렇게하면 런타임 릴리스가 GIL이되어 다른 스레드가 IO 집중적 인 작업 (예 : 네트워크 읽기 또는 쓰기) 중에 실행할 수 있습니다. 하지만 실행하면서 Python 코드를 실행하지 않아도됩니다.

관련 문제