문제

나는 self.output에 행을 추가하는 스레드와 self.done (또는 최대 실행 시간에 도달 할 때까지 실행되는 루프가 있습니다).

끊임없이 검사하여 그것이 완료되었는지 확인하는 while 루프를 사용하는 것 외에 더 효율적인 방법이 있습니까? while 루프는 CPU가 실행 중에 100%로 급증하게합니다 ..

time.clock()
while True:

    if len(self.output):
        yield self.output.pop(0)

    elif self.done or 15 < time.clock():
        if 15 < time.clock():
            yield "Maximum Execution Time Exceeded %s seconds" % time.clock()
        break
도움이 되었습니까?

해결책

당신의 스레드는 여기에 스스로가 부여되어 있으며, 주요 작업이 소비되면서 여기에 소비됩니까? 그렇다면 이것은 맞춤형 작업입니다 대기열. 코드는 다음과 같습니다.

import Queue

# Initialise queue as:
queue = Queue.Queue()
Finished = object()   # Unique marker the producer will put in the queue when finished

# Consumer:
try:
    while True:
        next_item = self.queue.get(timeout=15)
        if next_item is Finished: break
        yield next_item

except Queue.Empty:
    print "Timeout exceeded"

생산자 스레드는 대기열에 항목을 추가합니다 queue.put(item)

편집하다 원래 코드는 self.done을 확인할 때 레이스 문제가 있습니다 (예 : 깃발이 설정되기 전에 여러 항목이 대기열에 추가되어 코드가 첫 번째 코드에서 구제 될 수 있습니다). τζωτζιου의 제안으로 업데이트 - 프로듀서 스레드는 대신 큐에 특수 토큰 (완성)을 추가하여 완료되었음을 나타냅니다.

참고 : 여러 생산자 스레드가있는 경우 모두 완료 될 때 더 일반적인 접근 방식이 필요합니다. 동일한 전략으로이를 달성 할 수 있습니다. 각 스레드는 완성 된 마커를 표시하고 소비자는 NUM_THREADS 마커를 볼 때 종료됩니다.

다른 팁

세마포어를 사용하십시오. 작업 스레드가 완료되면 작업 스레드를 해제하고 작업자가 세마포어로 끝날 때까지 추가 스레드를 차단하십시오.

즉. 노동자에게는 같은 일을하십시오 self.done = threading.Semaphore() 일이 시작될 때 self.done.release() 완료되면. 위에서 언급 한 코드에서 바쁜 루프 대신 self.done.acquire(); 작업자 스레드가 완료되면 제어가 반환됩니다.

편집 : 필요한 시간 초과 값을 다루지 않는 것이 두렵습니다. 이것 문제 표준 라이브러리에서 세마포어 타임 아웃의 필요성을 설명합니다.

CPU를 포기하기 위해 while 루프를 반복 한 후 간단한 일시 정지를 만들려면 시간을 사용하여 잠 들어 있습니다. 완료된 후에 작업을 빨리 잡는 것이 얼마나 중요한지에 따라 각 반복 중에 잠을자는 시간을 설정해야합니다.

예시:

time.clock()
while True:

    if len(self.output):
        yield self.output.pop(0)

    elif self.done or 15 < time.clock():
        if 15 < time.clock():
            yield "Maximum Execution Time Exceeded %s seconds" % time.clock()
            break

    time.sleep(0.01) # sleep for 10 milliseconds

Mutex 모듈 또는 이벤트/세마포어를 사용하십시오

여기서는 동기화 프리미티브를 사용해야합니다. 이봐: http://docs.python.org/library/threading.html.

이벤트 객체는 매우 간단해 보이며 문제를 해결해야합니다. 조건 객체 또는 세마포어를 사용할 수도 있습니다.

이벤트 객체를 사용한 적이 없기 때문에 예제를 게시하지 않으며 대안은 아마도 덜 간단 할 것입니다.


편집하다: 나는 당신의 문제를 이해했는지 확실하지 않습니다. 스레드가 일부 조건이 통계 될 때까지 대기 할 수 있다면 동기화를 사용하십시오. 그렇지 않으면 sleep() 누군가가 너무 많은 CPU 시간을 소비하는 것에 대해 게시 한 솔루션.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top