2013-12-23 4 views
1

나는 트위스트가 새롭다. 속도 제한이있는 서버를 쿼리하는 HTTP 클라이언트가있다. 서버가 HTTP 204로 응답 할 때 서버가 HTTP 204로 응답하므로, response 나는 아마도 다음과 같이 불쾌한 일을하고 있습니다.뒤틀린 파이썬 일시 중지/반응기 지연

def handleResponse(r, ip): 
if r.code == 204: 
    print 'Got 204, sleeping' 
    time.sleep(120) 
    return None 
else: 
    jsonmap[ip] = '' 
    whenFinished = twisted.internet.defer.Deferred() 
    r.deliverBody(PrinterClient(whenFinished, ip)) 
    return whenFinished 

모든 작업을 일시 중지하고 싶기 때문에이 작업을하고 있습니다.

다음과 같은 두 가지 동작이 있습니다. 동일한 실행에서 나중에 204에 도달하는 작업을 다시 실행하거나 (가능하면 모름) 오류를 기록한 다음 다시 실행하십시오 그 후에 프로그램의 또 다른 실행에서. 올릴 수있는 또 다른 문제는 서버

timeoutCall = reactor.callLater(60, d.cancel) 
def completed(passthrough): 
    if timeoutCall.active(): 
     timeoutCall.cancel() 
    return passthrough 
d.addCallback(handleResponse, ip) 
d.addErrback(handleError, ip) 
d.addBoth(completed) 

아무런 반응이 없으면 (아래 코드 참조) 나는 시간의 미리 정의 된 시간 후에 지연을 취소하기 위해 연결에 시간 제한을 설정 한 것입니다 내가 마주 칠 수있는 또 다른 문제는 내가 잠든다면이 시간 초과에 걸리므로 모든 요청이 취소된다는 것입니다.

나는 충분히 정확했기를 바랍니다. 미리 감사드립니다.

Jeppo

답변

3

어떤 트위스트 기반 코드에 time.sleep(20)를 사용하지 마십시오. 이는 여러분이 사용하고있는 다른 Twisted 기반 코드가 만드는 기본 가정을 위반합니다.

N 초만큼 지연 시키려면 reactor.callLater(N, someFunction)을 사용하십시오.

프로그램에서 sleep 호출을 제거하면 원자로가 이벤트 처리를 중단했기 때문에 무의미한 시간 초과 문제가 해결됩니다.