New transporte e tipo de leitor em torcida
-
06-07-2019 - |
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.
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.