"첫 번째"를 처리하는 가장 좋은 방법에 대한 설명이 필요합니다. 지연된, 즉 지연된 방법을 사용하는 기존의 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를 들어
의 count_lines 방법 (일부 대용량 파일 등의 라인을 계산) 매우 느린 경우, 의지가 잠재적으로 "블록"전체 트위스트 응용 프로그램? 콜백과 오류 복구 및 원자로가 함께 작동하는 방법에 대한 많은 문서를 읽었습니다 (콜백은 신속하게 실행되거나 지연을 스스로 반환해야 함).이 경우에는 볼 수 없으며 실제로 몇 가지 포인터를 고맙게 생각합니다./예 등
거기에 몇 가지 기사이 "최초의"deferreds을 만들기에 가장 좋은 방법 처리/명확 설명? 나는 these excellent articles을 통해 읽었으며, 그들은 기본적인 이해의 일부로 많은 도움을주었습니다. 그러나 나는 여전히 조각을 놓친 것처럼 느낍니다. 코드 차단 를 들어
이이 DeferToThread 또는 reactor.spawnprocess에 대한 typicall 케이스 것입니까? 나는 this one 및 this article 같은 질문을 많이 읽어,하지만, 난 여전히 파일을 처리 할 때 잠재적으로 주로 코드를 차단 처리하는 방법에 대한 100 % 확실하지 않다 I/O
죄송 경우이의 너무 기본적인 것처럼 보입니다. 그러나 저는 Twisted를 더 철저하게 사용하고 싶습니다. (이것은 네트워크 지향적 인 측면 모두를위한 강력한 도구였습니다). 시간 내 주셔서 감사합니다.
신속하고 철저한 답변을 해주신 Martin에게 감사드립니다. 1. 그리고 2. 좋아,이 경우에는 스레드/스레드 풀 접근 *이 의미가 있습니다. –
3. 나는 GIL 때문에 파이썬에서 스레드를 조심하는 경향이 있지만 일반적으로 **는 Twisted 이벤트를 엉망으로 만들지 않고 같은 시간에'count_lines' 메소드를 실행하는 3-4 스레드에 대처할 수 있어야합니다 루프 (이 방법은 작은 "작업"에서 사용되어 파일의 데이터를 직렬로 장치로 전송합니다) –
선택 모듈에 대한 정보를 보내 주셔서 감사합니다. Twisted의 다른 종류의 원자로와 관련이있는 것으로 보입니다. 자세한 내용을 살펴 보겠습니다. 실용적인 사용을 위해 불행히도 그것은 Windows 플랫폼에서만 소켓을 지원합니다 (따라서 Windows에서 트위스트 된 직렬 지원을 사용할 때 다소 이상한 제한이있었습니다). –