2012-01-14 4 views
2

"첫 번째"를 처리하는 가장 좋은 방법에 대한 설명이 필요합니다. 지연된, 즉 지연된 방법을 사용하는 기존의 Twisted 메서드에 콜백과 오류를 추가하는 것이 아니라 최선의 방법입니다. 그 (것)들 창조의 원래 지연. 은 그냥 다소 큰 텍스트 파일의 줄 수를 계산하고, deferreds의 사슬에 대한 출발점으로 사용됩니다Python Twisted Deferred : 설명이 필요합니다.

는 구체적인 예를 들어, 여기에 같은 방법이 변화입니다.

방법 1 : 지연 기가 reactor.callLater 메서드에 의해 직접 실행되므로이 ​​하나의 기분은별로 좋지 않습니다.

def get_line_count(self): 
    deferred = defer.Deferred() 

    def count_lines(result): 
     try: 
      print_file = file(self.print_file_path, "r") 
      self.line_count = sum(1 for line in print_file) 
      print_file.close() 
      return self.line_count 
     except Exception as inst: 
      raise InvalidFile() 

    deferred.addCallback(count_lines) 
    reactor.callLater(1, deferred.callback, None) 
    return deferred 

방법 2 : 연기로 결과가

def get_line_count(self): 
    deferred = defer.Deferred() 

    def count_lines(): 
     try: 
      print_file = file(self.print_file_path, "r") 
      self.line_count = sum(1 for line in print_file) 
      print_file.close() 
      deferred.callback(self.line_count) 
     except Exception as inst: 
      deferred.errback(InvalidFile()) 

    reactor.callLater(1, count_lines) 
    return deferred 

주를 사용할 수있을 때 약간 더 나은, 실제로 을 해고 : 또한이 두 가지가 있음을 지적 할 수 실제로는 동기적이고 잠재적으로 블로킹 방법을 사용합니다 (그리고 아마도 "MaybeDeferred"을 사용할 수 있습니다). 하지만 사실 그것은 내가 혼란스러워하는 측면 중 하나입니다. 방법 2를 들어

  1. count_lines 방법 (일부 대용량 파일 등의 라인을 계산) 매우 느린 경우, 의지가 잠재적으로 "블록"전체 트위스트 응용 프로그램? 콜백과 오류 복구 및 원자로가 함께 작동하는 방법에 대한 많은 문서를 읽었습니다 (콜백은 신속하게 실행되거나 지연을 스스로 반환해야 함).이 경우에는 볼 수 없으며 실제로 몇 가지 포인터를 고맙게 생각합니다./예 등

  2. 거기에 몇 가지 기사이 "최초의"deferreds을 만들기에 가장 좋은 방법 처리/명확 설명? 나는 these excellent articles을 통해 읽었으며, 그들은 기본적인 이해의 일부로 많은 도움을주었습니다. 그러나 나는 여전히 조각을 놓친 것처럼 느낍니다. 코드 차단 를 들어

  3. 이이 DeferToThread 또는 reactor.spawnprocess에 대한 typicall 케이스 것입니까? 나는 this onethis article 같은 질문을 많이 읽어,하지만, 난 여전히 파일을 처리 할 때 잠재적으로 주로 코드를 차단 처리하는 방법에 대한 100 % 확실하지 않다 I/O

죄송 경우이의 너무 기본적인 것처럼 보입니다. 그러나 저는 Twisted를 더 철저하게 사용하고 싶습니다. (이것은 네트워크 지향적 인 측면 모두를위한 강력한 도구였습니다). 시간 내 주셔서 감사합니다.

답변

2

그렇습니다. Twisted 이벤트 루프를 막지 않으려면 스레드 또는 별도의 프로세스가 필요합니다. Deferreds를 사용하면 마술처럼 코드를 비 블로킹하지 않게됩니다.질문 :

  1. 예, count_lines이 매우 느린 경우 이벤트 루프를 차단합니다. 그것을 스레드에 전달하면이를 해결할 수 있습니다.

  2. 나는 Twisteds documentation을 사용하여 Deferreds의 작동 방식을 학습했지만, 이미 사용해 본 것으로 보입니다. database support에 대한 기사는이 라이브러리가 스레드를 사용하여 작성되었다고 분명히 말하기 때문에 정보였습니다. 이것은 동기 비동기 갭을 연결하는 방법입니다.

  3. 전화가 정말로 차단되는 경우 DeferToThread이 필요합니다. 파이썬 자체는 일종의 단일 스레드입니다. 즉, 한 번에 하나의 스레드 만 파이썬 바이트 코드를 실행할 수 있습니다. 그러나 생성 한 스레드가 I/O에서 차단되는 경우이 모델은 잘 작동합니다. 스레드는 전역 인터프리터 잠금을 해제하고 Twisted 이벤트 루프가있는 주 스레드를 포함하여 다른 Python 스레드가 실행되도록합니다.

    코드에 비 차단 I/O를 사용할 수도 있습니다. 예를 들어, select 모듈을 사용하여이 작업을 수행 할 수 있습니다. 이 경우 별도의 스레드가 필요하지 않습니다. Twisted는이 기술을 내부적으로 사용하기 때문에 정상적인 네트워크 I/O를 수행하는 경우에는이 기술을 생각할 필요가 없습니다. 그러나 당신이 이국적인 것을하고 있다면, 당신이 똑같이 할 수 있도록 물건이 어떻게 만들어 졌는지 아는 것이 좋다.

나는 조금 더 명확하게 보이기를 바랍니다.

+0

신속하고 철저한 답변을 해주신 Martin에게 감사드립니다. 1. 그리고 2. 좋아,이 경우에는 스레드/스레드 풀 접근 *이 의미가 있습니다. –

+0

3. 나는 GIL 때문에 파이썬에서 스레드를 조심하는 경향이 있지만 일반적으로 **는 Twisted 이벤트를 엉망으로 만들지 않고 같은 시간에'count_lines' 메소드를 실행하는 3-4 스레드에 대처할 수 있어야합니다 루프 (이 방법은 작은 "작업"에서 사용되어 파일의 데이터를 직렬로 장치로 전송합니다) –

+0

선택 모듈에 대한 정보를 보내 주셔서 감사합니다. Twisted의 다른 종류의 원자로와 관련이있는 것으로 보입니다. 자세한 내용을 살펴 보겠습니다. 실용적인 사용을 위해 불행히도 그것은 Windows 플랫폼에서만 소켓을 지원합니다 (따라서 Windows에서 트위스트 된 직렬 지원을 사용할 때 다소 이상한 제한이있었습니다). –