Pergunta

Eu estou tentando adicionar um novo transporte para Torcido, que irá ler dados de um fluxo -. Um arquivo de uma forma tail -f, ou a partir de um tubo, mas eu tenho alguns problemas com arquitetura trançado

Eu tenho o próprio (implementos ITransport) transporte pronto - ele lida com tudo de abertura de arquivo. Eu tenho funções de streaming / deferreds pronto. Como faço para colocá-lo juntos agora? Eu gostaria de relatar o novo de volta dados para dataReceived() de algum protocolo.

Eu poderia, claro, criar um novo objeto que irá configurar os monitores de E / S com retornos adequados, cadastre-se uma chamada de retorno no reator desligar (para fechar os arquivos / protocolos) e começar tudo manualmente - mas é que "o caminho certo "? Existe qualquer Buscamos abstração que eu poderia usar? Eu vi reactor.connectWith(), mas ele realmente não oferecem muito de uma abstração ...

Além disso - como é que eu vou passar os dados do meu leitor para o protocolo? ITransport não define qualquer interface para ele, mesmo que ele parece ser exatamente a responsabilidade do transporte.

Foi útil?

Solução

Parece que você já principalmente descobriu como fazer isso. Você pode estar interessado em twisted.internet.fdesc.readFromFD, mas é apenas algumas linhas de comprimento e ele não está fazendo nada de particularmente complicado (é algumas linhas que você não tem de manter, embora). Além de que -. Sim, você tem que fazer o I / O monitoramento neste caso, porque descritores de arquivos regulares não são suportados por seleção / pesquisa / epoll (eles sempre são reportados imediata, não o que você quer)

Alguns trabalho tem sido feito no apoio inotify em torcida ( http://twistedmatrix.com/trac/ticket / 972 ), mas isso não está completo ainda, por isso não vai ser diretamente útil para você agora (a menos que você quer terminar ajuda-lo e usá-lo). Supondo que você só usar polling baseado no tempo, muito do que está no reator não vai te ajudar muito, já que o código é focado em utilizar uma prontidão API fornecido pelo sistema (ou seja, selecionar / pesquisa / epoll) para eventos de disparo .

Para o caso de tubos, porém, você deve ser capaz de usar e beneficiar de métodos de IReactorFDSet -. addReader et al

O transporte de votação com base no tempo pode ainda beneficiar de implementação ITransport - embora eu não sei como você poderia implementar write para uma tail -f-like transporte. Você vai certamente se beneficiar de ter o seu transporte fornecer dados através da interface IProtocol, uma vez que este simplifica code-reutilização. IProtocol.dataReceived é exatamente como você quer passar dados de seu leitor (eu acho que é o mesmo que o seu transportes , não é?). Esta não é definido em ITransport porque é um método que você chama em algum outro objeto que não é o transporte.

reactor.connectWith provavelmente não vai comprar nada. Como você diz, não é muito de uma abstração; Eu diria que é mais um erro. :)

Não se preocupe muito sobre não ser capaz de adicionar métodos diretamente para o reactor. A-livre função que aceita um reator como um parâmetro é tão fácil de usar.

Para o retorno de chamada de desligamento, addReader deve realmente obter a maior parte do caminho até lá. Qualquer leitor no reactor a tempo de desligamento terá connectionLost chamado sobre ele (parte de IFileDescriptor). Você deve implementar isso para limpar os arquivos e protocolo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top