2012-02-16 6 views
2

내 코드는 다음과 같습니다꼬인 비 차단 방법 - 방법?

... # class Site(Resource) 
def render_POST(self,request) 
    otherclass.doAssync(request.args) 
    print '1' 
    return "done" #that returns the HTTP response, always the same. 

... 

def doAssync(self,msg): 
    d = defer.Deferred() 
    reactor.callLater(0,self.doStuff,d,msg) 
    d.addCallback(self.sucess) 

def doStuff(self,d,msg): 
    # do some stuff 
    time.sleep(2) #just for example 
    d.callback('ok') 

def sucess(msg): 
    print msg 

출력 :

1

확인

, 지금까지 너무 좋아하지만, HTTP 응답 (귀국일 ' done '), 지연 후에 만 ​​발생합니다 (time.sleep (2)). 브라우저에서 2 초 동안 '로드 중'을 유지하므로이 사실을 알 수 있습니다.

내가 뭘 잘못하고 있니?

+0

답변 찾기 : http://stackoverflow.com/questions/6759115/asynchronous-wsgi-with-twisted – joaoricardo000

+2

Twisted API를 사용하는 스레드 (예 : d.callback-in을 포함)에주의하십시오.이 버전의 코드는 잘못된 스레드에서'd.callback'을 사용합니다. 이렇게하면 모든 콜백이 잘못된 스레드에서 실행되므로 결과를 인쇄하는 것 이상의 작업을 수행하는 즉시 무언가가 깨질 수 있습니다. –

답변

3

트위스티드 (Twisted)는 블로킹 콜 (time.sleep(2))을 잘못 실행하고 있으며 블로킹되지 않은 작업 만 수행 할 것으로 예상합니다. 기다리지 않는 것들. 당신은 그 안에 time.sleep(2)을 가지고 있기 때문에, Twisted는 그 기능이 자고있는 동안 다른 것을 할 수 없습니다. 따라서 브라우저에 어떤 데이터도 전송할 수 없습니다.

time.sleep(2)의 경우 다른 reactor.callLater 호출로 바꿉니다. time.sleep(2) 호출이 다른 블로킹 동작이 될 것이라는 것을 실제로 가정한다면,이를 해결하는 방법은 작업에 따라 다릅니다. 비 차단 방식으로 작업을 수행 할 수 있다면 그렇게하십시오. 데이터베이스 상호 작용과 같은 많은 작업에서 Twisted는 이미 비 차단 대안을 제공합니다. 만약 당신이하고있는 일이 비 블로킹 인터페이스를 가지고 있지 않고 Twisted가 대안을 가지고 있지 않다면 코드가 실제로 쓰레드이기 때문에 별도의 쓰레드 (예 : twisted.internet.threads.deferToThread 사용)에서 코드를 실행해야 할 수도 있습니다 -안전한.

+0

그래서 reactor.callLater (...)를'deferToThread (...) '로 대체 할 수 있습니까? –

+0

네, 그냥이 일을하고 내 문제를 해결! 감사!! – joaoricardo000

+0

reactor.callInThread (global_function)을 수행하고 global_function에 로컬 파일을 읽는 것과 같은 내용의 블록 처리와 같은 차단 작업이있는 경우 global_function이 실행되는 동안에는 응답이 느려지면서 팩토리 스레드가 영향을받는 것 같습니다. 이유는 무엇입니까? –