O Node.js é uma combinação perfeita para o nosso projeto web, mas há poucas tarefas computacionais para as quais preferimos o Python. Também já temos um código Python para eles. Estamos muito preocupados com a velocidade, qual é a maneira mais elegante de como chamar um "trabalhador" Python do node.js de maneira assíncrona e sem bloqueio?
127
Respostas:
Para comunicação entre o node.js e o servidor Python, eu usaria soquetes Unix se ambos os processos fossem executados no mesmo servidor e soquetes TCP / IP. Para o protocolo de empacotamento, eu levaria JSON ou buffer de protocolo . Se o Python encadeado parecer um gargalo, considere usar o Twisted Python , que fornece a mesma simultaneidade orientada a eventos que o node.js.
Se você se sentir aventureiro, aprenda clojure ( clojurescript , clojure-py ) e obterá a mesma linguagem que é executada e interopera com o código existente em Java, JavaScript (node.js incluído), CLR e Python. E você obtém um excelente protocolo de empacotamento usando simplesmente estruturas de dados clojure.
fonte
Isso soa como um cenário em que zeroMQ seria um bom ajuste. É uma estrutura de mensagens semelhante ao uso de soquetes TCP ou Unix, mas é muito mais robusta ( http://zguide.zeromq.org/py:all )
Existe uma biblioteca que usa zeroMQ para fornecer uma estrutura RPC que funciona muito bem. Chama-se zeroRPC ( http://www.zerorpc.io/ ). Aqui está o olá mundo.
Servidor Python "Hello x":
E o cliente node.js:
Ou vice-versa, servidor node.js:
E o cliente python
fonte
Se você deseja ter seu trabalhador Python em um processo separado (processo do tipo servidor demorado ou um filho gerado sob demanda), sua comunicação com ele será assíncrona no lado do node.js. Os soquetes UNIX / TCP e a comunicação stdin / out / err são inerentemente assíncronos no nó.
fonte
Eu consideraria também o Apache Thrift http://thrift.apache.org/
Pode fazer a ponte entre várias linguagens de programação, é altamente eficiente e oferece suporte para chamadas assíncronas ou sincronizadas. Veja todos os recursos aqui http://thrift.apache.org/docs/features/
A linguagem múltipla pode ser útil para planos futuros; por exemplo, se você quiser fazer parte da tarefa computacional em C ++ mais tarde, é muito fácil adicioná-la à mistura usando o Thrift.
fonte
Eu tive muito sucesso usando thoonk.js junto com thoonk.py . A Thoonk utiliza o Redis (armazenamento de valores-chave na memória) para fornecer alimentação (pense em publicar / assinar), fila e padrões de tarefas para comunicação.
Por que isso é melhor do que soquetes unix ou soquetes tcp diretos? O desempenho geral pode diminuir um pouco, no entanto, a Thoonk fornece uma API realmente simples que simplifica a necessidade de lidar manualmente com um soquete. A Thoonk também ajuda a tornar realmente trivial a implementação de um modelo de computação distribuída que permita dimensionar seus trabalhadores python para aumentar o desempenho, pois você apenas cria novas instâncias de seus trabalhadores python e os conecta ao mesmo servidor redis.
fonte
Eu recomendo usar alguma fila de trabalho usando, por exemplo, o excelente Gearman , que fornecerá uma ótima maneira de enviar tarefas em segundo plano e obter o resultado de forma assíncrona quando processados.
A vantagem disso, muito usada no Digg (entre muitos outros), é que ele fornece uma maneira forte, escalável e robusta de fazer com que trabalhadores em qualquer idioma falem com clientes em qualquer idioma.
fonte
Atualização 2019
Existem várias maneiras de conseguir isso e aqui está a lista em ordem crescente de complexidade
Abordagem 1 Python Shell Abordagem mais simples
arquivo source.js
arquivo destination.py
Notas : Crie uma pasta chamada assinante que esteja no mesmo nível do arquivo source.js e coloque o destination.py dentro dela. Não se esqueça de mudar seu ambiente virtualenv
fonte