Node.js идеально подходит для нашего веб-проекта, но есть несколько вычислительных задач, для которых мы бы предпочли Python. У нас также уже есть для них код Python. Нас очень беспокоит скорость. Каков самый элегантный способ вызвать Python "worker" из node.js асинхронным неблокирующим способом?
128
Ответы:
Для связи между node.js и сервером Python я бы использовал сокеты Unix, если оба процесса выполняются на одном сервере, и сокеты TCP / IP в противном случае. Для протокола маршалинга я бы взял JSON или буфер протокола . Если поточный Python оказывается узким местом, рассмотрите возможность использования Twisted Python , который обеспечивает такой же управляемый событиями параллелизм, как и node.js.
Если вы любите приключения, изучите clojure ( clojurescript , clojure-py ), и вы получите тот же язык, который работает и взаимодействует с существующим кодом на Java, JavaScript (включая node.js), CLR и Python. И вы получаете превосходный протокол маршаллинга, просто используя структуры данных clojure.
источник
Это звучит как сценарий, в котором zeroMQ будет подходящим вариантом. Это структура обмена сообщениями, аналогичная использованию сокетов TCP или Unix, но намного более надежная ( http://zguide.zeromq.org/py:all )
Есть библиотека, которая использует zeroMQ для предоставления хорошо работающей инфраструктуры RPC. Это называется zeroRPC ( http://www.zerorpc.io/ ). Вот привет, мир.
Сервер Python "Hello x":
И клиент node.js:
Или наоборот, сервер node.js:
И клиент python
источник
Если вы разместите свой рабочий Python в отдельном процессе (либо длительном процессе серверного типа, либо порожденном дочернем процессе по запросу), ваше взаимодействие с ним будет асинхронным на стороне node.js. Сокеты UNIX / TCP и связь stdin / out / err по своей сути асинхронны в узле.
источник
Я бы рассмотрел также Apache Thrift http://thrift.apache.org/
Он может связывать несколько языков программирования, очень эффективен и поддерживает вызовы async или sync. См. Полные возможности здесь http://thrift.apache.org/docs/features/
Многоязычный язык может быть полезен для будущих планов, например, если вы позже захотите выполнить часть вычислительной задачи на C ++, очень легко добавить его в смесь с помощью Thrift.
источник
У меня был большой успех, используя thoonk.js вместе с thoonk.py . Thoonk использует Redis (хранилище ключей и значений в памяти), чтобы предоставить вам канал (например, публикацию / подписку), очереди и шаблоны заданий для общения.
Почему это лучше, чем сокеты unix или прямые сокеты tcp? Общая производительность может немного снизиться, однако Thoonk предоставляет действительно простой API, который упрощает работу с сокетом вручную. Thoonk также помогает упростить реализацию модели распределенных вычислений, которая позволяет масштабировать ваших работников python для повышения производительности, поскольку вы просто запускаете новые экземпляры своих работников python и подключаете их к тому же серверу Redis.
источник
Я бы рекомендовал использовать некоторую рабочую очередь, используя, например, отличный Gearman , который предоставит вам отличный способ отправлять фоновые задания и асинхронно получать их результат после обработки.
Преимущество этого, широко используемого на Digg (среди многих других), заключается в том, что он обеспечивает надежный, масштабируемый и надежный способ заставить сотрудников на любом языке говорить с клиентами на любом языке.
источник
Обновление 2019
Есть несколько способов добиться этого, и вот список в порядке возрастания сложности.
Подход 1 Python Shell Самый простой подход
файл source.js
файл destination.py
Примечания : Создайте папку с именем subscriber, которая находится на том же уровне, что и файл source.js, и поместите в нее файл destination.py. Не забудьте изменить среду virtualenv
источник