Node.js es una combinación perfecta para nuestro proyecto web, pero hay pocas tareas computacionales para las cuales preferiríamos Python. También ya tenemos un código Python para ellos. Estamos muy preocupados por la velocidad, ¿cuál es la forma más elegante de llamar a un "trabajador" de Python desde node.js de forma asincrónica sin bloqueo?
127
Respuestas:
Para la comunicación entre node.js y el servidor Python, usaría sockets Unix si ambos procesos se ejecutan en el mismo servidor y los sockets TCP / IP de lo contrario. Para el protocolo de clasificación, tomaría JSON o buffer de protocolo . Si Python roscado parece ser un cuello de botella, considere usar Twisted Python , que proporciona la misma concurrencia impulsada por eventos que node.js.
Si se siente aventurero, aprenda clojure ( clojurescript , clojure-py ) y obtendrá el mismo lenguaje que se ejecuta e interopera con el código existente en Java, JavaScript (incluido node.js), CLR y Python. Y obtienes un excelente protocolo de clasificación simplemente usando estructuras de datos de clojure.
fuente
Esto suena como un escenario donde zeroMQ encajaría bien. Es un marco de mensajería similar al uso de sockets TCP o Unix, pero es mucho más robusto ( http://zguide.zeromq.org/py:all )
Hay una biblioteca que usa zeroMQ para proporcionar un marco RPC que funciona bastante bien. Se llama zeroRPC ( http://www.zerorpc.io/ ). Aquí está el hola mundo.
Servidor Python "Hola x":
Y el cliente node.js:
O viceversa, el servidor node.js:
Y el cliente python
fuente
Si hace arreglos para que su trabajador de Python esté en un proceso separado (ya sea un proceso de tipo servidor de larga ejecución o un hijo generado bajo demanda), su comunicación con él será asíncrona en el lado de node.js. Los sockets UNIX / TCP y la comunicación stdin / out / err son inherentemente asíncronos en el nodo.
fuente
Consideraría también Apache Thrift http://thrift.apache.org/
Se puede conectar entre varios lenguajes de programación, es altamente eficiente y tiene soporte para llamadas asíncronas o sincronizadas. Ver características completas aquí http://thrift.apache.org/docs/features/
El lenguaje múltiple puede ser útil para planes futuros, por ejemplo, si luego desea realizar parte de la tarea computacional en C ++, es muy fácil agregarlo a la mezcla usando Thrift.
fuente
He tenido mucho éxito usando thoonk.js junto con thoonk.py . Thoonk aprovecha Redis (almacén de valores clave en memoria) para proporcionarle alimentación (piense en publicar / suscribirse), cola y patrones de trabajo para la comunicación.
¿Por qué es esto mejor que los sockets unix o los sockets tcp directos? El rendimiento general puede disminuir un poco, sin embargo, Thoonk proporciona una API realmente simple que simplifica tener que lidiar manualmente con un socket. Thoonk también ayuda a que sea realmente trivial implementar un modelo de computación distribuida que le permita escalar sus trabajadores de python para aumentar el rendimiento, ya que simplemente activa nuevas instancias de sus trabajadores de python y las conecta al mismo servidor redis.
fuente
Recomiendo usar algunas colas de trabajo utilizando, por ejemplo, el excelente Gearman , que le proporcionará una excelente manera de enviar trabajos en segundo plano y obtener su resultado de forma asincrónica una vez que se procesen.
La ventaja de esto, utilizada en gran medida en Digg (entre muchos otros) es que proporciona una forma sólida, escalable y robusta de hacer que los trabajadores en cualquier idioma hablen con los clientes en cualquier idioma.
fuente
Actualización 2019
Hay varias formas de lograr esto y aquí está la lista en orden creciente de complejidad
Enfoque 1 Python Shell Enfoque más simple
archivo source.js
archivo destination.py
Notas : Cree una carpeta llamada suscriptor que esté al mismo nivel que el archivo source.js y coloque destination.py dentro de ella. No olvides cambiar tu entorno virtualenv
fuente