time.sleep — 쓰레드 나 프로세스를 슬리핑합니까?


답변:


353

스레드를 차단합니다. Python 소스에서 Modules / timemodule.c를 살펴보면을 호출 floatsleep()하면 휴면 작업의 실질적인 부분이 Py_BEGIN_ALLOW_THREADS 및 Py_END_ALLOW_THREADS 블록에 래핑되어 현재 다른 스레드가 현재 실행되는 동안 계속 실행될 수 있음을 알 수 있습니다 하나는 자요. 간단한 파이썬 프로그램으로 이것을 테스트 할 수도 있습니다.

import time
from threading import Thread

class worker(Thread):
    def run(self):
        for x in xrange(0,11):
            print x
            time.sleep(1)

class waiter(Thread):
    def run(self):
        for x in xrange(100,103):
            print x
            time.sleep(5)

def run():
    worker().start()
    waiter().start()

다음과 같이 인쇄됩니다.

>>> thread_test.run()
0
100
>>> 1
2
3
4
5
101
6
7
8
9
10
102

3
"스레드"가 어떻게 막혔는지 설명하는 방법. 그리고 5와 103 만 인쇄되지 않는 반면 다른 모든 숫자는 인쇄됩니다. 누군가 설명 할 수 있다면 정말 도움이 될 것입니다.
akki

@akki : 오래된 질문의 의견을 사용하는 대신 새로운 질문을하십시오. 또한 5가 인쇄됩니다 (101 바로 전).
Nick Bastin

8
이 답변의 의미를 묻는 새로운 질문을여시겠습니까? 나에게는 꽤 이상해 보인다. 그리고 11 (5 아님)을 의미했습니다. 죄송합니다. 지금 내 의견을 수정할 수 없습니다. 실제로이 답변이 어떤 지점을 만들려고하는지 이해하는 데 도움이 필요합니다.
akki

첫 번째 대답 : 범위 함수 xrange (k, m)는 숫자 k를 포함하여 m-1까지의 숫자를 반환하므로 식 목록 (xrange (100, 103))은 [100, 101, 102]를 반환합니다. 이것은 length (list (xrange (k, m))) == m-k를 의미합니다.
Jeff Younker

3
akki, 구체적으로 time.sleep ()은 time.sleep ()이라는 스레드를 차단하지만 다른 스레드를 실행하기 위해 Python GIL을 해제하므로 프로세스를 차단하지 않습니다. Nick의 예제는 실제로 스레드 차단을 보여주지 않았으며 GIL이 해제되었음을 보여줍니다 (따라서 프로세스가 차단되지 않음을 나타냄). 그는 웨이터 () 스레드 time.sleep (5) 후 인쇄 문처럼 더 많은 물건이 있다면 나는 그것이 인쇄가 완료 time.sleep (5) (즉, 차단)까지 후 발생하지 않았 음을 보여주는 것이라고 생각
gunit

52

응용 프로그램에 단일 스레드 만있는 경우를 제외하고 스레드를 절전 모드로 전환합니다.이 경우 스레드를 절전 모드로 설정하고 프로세스를 효과적으로 수행합니다.

잠자기 파이썬 문서는 이것을 지정하지 않으므로 혼란을 확실히 이해할 수 있습니다!

http://docs.python.org/2/library/time.html




13

스레드가 차단되지만 프로세스는 여전히 활성 상태입니다.

단일 스레드 응용 프로그램에서 이는 잠자는 동안 모든 것이 차단됨을 의미합니다. 멀티 스레드 응용 프로그램에서는 명시 적으로 '슬립'하는 스레드 만 차단되고 프로세스 내에서 다른 스레드는 계속 실행됩니다.



2

프로세스 자체는 실행할 수 없습니다. 실행과 관련하여 프로세스는 스레드의 컨테이너 일뿐입니다. 프로세스를 일시 중지 할 수 없음을 의미합니다. 단순히 처리 할 수 ​​없습니다.


응? 이것은 Windows 또는 기타 상황에서 사실 일 수 있지만 확실히 보편적 인 것은 아닙니다. 유닉스는 전통적으로 스레드를 전혀 가지고 있지 않았기 때문에 파이썬 프로그램은 프로세스가 (일부 스레드로, 추상적 인 의미로) sleep명령을 일시 중지 시키는 프로세스를 실행합니다 .
tripleee

실망스럽게도 슬프지만 Windows 및 모든 * nix 시스템에서 주요 실행 단위는 스레드입니다. 스레드없이 프로세스를 실행할 수 없습니다. 마지막 스레드를 종료하면 프로세스가 종료됩니다.
Denis The Menace

이것은 질문에 대답하지 않습니다. 특히이 질문은 Python에 관한 것입니다. 파이썬에는 Global Interpreter Lock (GIL)이 있습니다. 스레드가 GIL을 유지하는 동안 휴면 상태가되면 프로세스의 모든 Python 스레드가 모두 동일한 잠금을 공유하기 때문에 차단합니다.
Cort Ammon

1

메인 코드에서 실행되지 않으면 동일한 스레드에서 실행되면 스레드를 차단합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.