문제

나는 Twisted에 새로운 전송을 추가하려고 합니다. 이는 스트림에서 데이터를 읽습니다. tail -f 방식으로 또는 파이프를 통해 연결할 수 있지만 Twisted 아키텍처에는 몇 가지 문제가 있습니다.

나는 운송 자체를 가지고 있습니다 (구현 ITransport) 준비 - 모든 파일 열기를 처리합니다.스트리밍 기능/지연이 준비되었습니다.이제 어떻게 정리해야 할까요?새로운 데이터를 일부 프로토콜에 다시 보고하고 싶습니다. dataReceived().

물론 적절한 콜백으로 I/O 모니터를 설정하고, 리액터 종료 시 콜백을 등록하고(파일/프로토콜을 닫기 위해) 모든 것을 수동으로 시작하는 새 객체를 생성할 수 있지만 이것이 "올바른 방법"입니까? ?사용할 수 있는 더 좋은 추상화가 있나요?나는 본 적이 reactor.connectWith(), 하지만 실제로는 추상화를 많이 제공하지 않습니다.

또한 - 내 리더에서 프로토콜로 데이터를 어떻게 전달해야 합니까?ITransport는 정확히 전송의 책임인 것처럼 보이지만 이에 대한 인터페이스를 정의하지 않습니다.

도움이 되었습니까?

해결책

이 작업을 수행하는 방법을 대부분 알아낸 것 같습니다.당신은 관심이있을 수 있습니다 twisted.internet.fdesc.readFromFD, 그러나 길이는 몇 줄에 불과하고 특별히 복잡한 작업을 수행하지 않습니다(그래도 유지 관리할 필요가 없는 몇 줄입니다).그 외에도 - 예, 이 경우 I/O 모니터링을 수행해야 합니다. 일반 파일 설명자는 select/poll/epoll에서 지원되지 않기 때문입니다(원하는 것이 아니라 항상 준비된 것으로 보고됩니다).

Twisted에서 inotify를 지원하기 위한 일부 작업이 완료되었습니다(http://twistedmatrix.com/trac/ticket/972) 그러나 이는 아직 완료되지 않았으므로 지금은 직접적으로 유용하지 않을 것입니다(완료하고 사용하는 데 도움을 주고 싶지 않은 경우).시간 기반 폴링만 사용한다고 가정하면 리액터에 있는 대부분의 내용은 그다지 도움이 되지 않습니다. 해당 코드는 이벤트를 트리거하기 위해 시스템에서 제공하는 준비 API(예: select/poll/epoll)를 사용하는 데 중점을 두기 때문입니다. .

그러나 파이프 케이스의 경우 다음을 사용하고 이점을 얻을 수 있습니다. IReactorFDSet님의 방법 - addReader 외.

시간 기반 투표 전송을 구현하면 여전히 이점을 얻을 수 있습니다. ITransport - 구현 방법을 잘 모르겠지만 write 한 동안 tail -f-같은 교통수단.귀하는 전송을 통해 데이터를 전달함으로써 확실히 이점을 얻을 수 있습니다. IProtocol 인터페이스, 이는 코드 재사용을 단순화하기 때문입니다. IProtocol.dataReceived 정확히 당신이 당신의 데이터를 전달하려는 방법입니다 리더 (내 생각엔 너랑 똑같은 것 같아 수송, 그렇지 않습니까?).이것은 정의되어 있지 않습니다. ITransport 이는 전송이 아닌 다른 개체에 대해 호출하는 메서드이기 때문입니다.

reactor.connectWith 아마 당신에게 아무것도 사지 않을 것입니다.당신이 말했듯이 그것은 그다지 추상적인 것이 아닙니다.오히려 실수라고 말하고 싶습니다.:)

리액터에 메서드를 직접 추가할 수 없다고 너무 걱정하지 마세요.리액터를 매개변수로 받아들이는 자유 함수도 사용하기 쉽습니다.

종료 콜백의 경우 addReader 실제로 당신을 거기까지 데려다 줄 것입니다.종료 시간에 원자로에 있는 모든 리더는 connectionLost 그것을 불렀다(일부 IFileDescriptor).파일과 프로토콜을 정리하려면 이를 구현해야 합니다.

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