Объединение node.js и Python

Node.js идеально подходит для нашего веб-проекта, но есть несколько вычислительных задач, для которых мы бы предпочли Python. У нас также уже есть код Python для них. Мы очень обеспокоены скоростью. Какой самый элегантный способ назвать Python «работником» из node.js асинхронным неблокирующим способом?

117 голосов | спросил Cartesius00 27 Maypm12 2012, 20:03:52

6 ответов


0

Для связи между node.js и сервером Python я бы использовал сокеты Unix, если оба процесса выполняются на одном сервере, а сокеты TCP /IP в противном случае. Для протокола маршалинга я бы взял JSON или буфер протокола . Если многопоточный Python оказывается узким местом, рассмотрите возможность использования Twisted Python , который обеспечивает тот же управляемый событиями параллелизм, что и node.js.

Если вы испытываете приключения, изучите clojure ( clojurescript , clojure-py ) и вы ' Вы получите тот же язык, который работает и взаимодействует с существующим кодом на Java, JavaScript (включая node.js), CLR и Python. И вы получаете превосходный протокол сортировки, просто используя структуры данных clojure.

ответил Aleš Kotnik 27 Maypm12 2012, 20:17:28
0

Это звучит как сценарий, где zeroMQ подойдет. Это среда обмена сообщениями, похожая на использование сокетов TCP или Unix, но гораздо более надежная ( http: //zguide. zeromq.org/py:all )

Есть библиотека, которая использует zeroMQ для обеспечения среды RPC, которая работает довольно хорошо. Он называется zeroRPC ( http://www.zerorpc.io/). Вот привет мир.

Python "Hello x" сервер:

import zerorpc

class HelloRPC(object):
    '''pass the method a name, it replies "Hello name!"'''
    def hello(self, name):
        return "Hello, {0}!".format(name)

def main():
    s = zerorpc.Server(HelloRPC())
    s.bind("tcp://*:4242")
    s.run()

if __name__ == "__main__" : main()

И клиент node.js:

var zerorpc = require("zerorpc");

var client = new zerorpc.Client();
client.connect("tcp://127.0.0.1:4242");
//calls the method on the python object
client.invoke("hello", "World", function(error, reply, streaming) {
    if(error){
        console.log("ERROR: ", error);
    }
    console.log(reply);
});

Или наоборот, сервер node.js:

var zerorpc = require("zerorpc");

var server = new zerorpc.Server({
    hello: function(name, reply) {
        reply(null, "Hello, " + name, false);
    }
});

server.bind("tcp://0.0.0.0:4242");

И клиент Python

import zerorpc, sys

c = zerorpc.Client()
c.connect("tcp://127.0.0.1:4242")
name = sys.argv[1] if len(sys.argv) > 1 else "dude"
print c.hello(name)
ответил djheru 27 MarpmWed, 27 Mar 2013 17:54:55 +04002013-03-27T17:54:55+04:0005 2013, 17:54:55
0

Если вы договорились о том, чтобы ваш рабочий Python был отдельным процессом (либо долго выполняющимся процессом серверного типа, либо порожденным дочерним процессом по требованию), то ваше взаимодействие с ним будет асинхронным на стороне node.js. Сокеты UNIX /TCP и связь stdin /out /err по своей сути асинхронны в узле.

ответил lanzz 27 Maypm12 2012, 20:17:03
0

Я бы также рассмотрел Apache Thrift http://thrift.apache.org/

Он может соединять несколько языков программирования, высокоэффективен и поддерживает асинхронные или синхронизирующие вызовы. Подробные сведения см. Здесь http://thrift.apache.org/docs/features/

Многоязычность может быть полезна для будущих планов, например, если позже вы захотите выполнить часть вычислительной задачи в C ++, очень легко добавить ее в микширование с помощью Thrift.

ответил Iftah 6 FebruaryEurope/MoscowbWed, 06 Feb 2013 11:08:20 +0400000000amWed, 06 Feb 2013 11:08:20 +040013 2013, 11:08:20
0

Я добился большого успеха, используя thoonk.js вместе с thoonk.py . Thoonk использует Redis (хранилище ключей-значений в памяти), чтобы предоставить вам фид (например, публикация /подписка), очереди и шаблоны заданий для связи.

Почему это лучше, чем сокеты unix или прямые сокеты tcp? Общая производительность может немного снизиться, однако Thoonk предоставляет действительно простой API, который упрощает ручную работу с сокетом. Thoonk также помогает упростить реализацию модели распределенных вычислений, которая позволяет вам масштабировать работников Python для повышения производительности, поскольку вы просто раскручиваете новые экземпляры ваших работников Python и подключаете их к одному серверу Redis.

ответил Doug McCall 18 +04002012-10-18T17:27:29+04:00312012bEurope/MoscowThu, 18 Oct 2012 17:27:29 +0400 2012, 17:27:29
0

Я бы порекомендовал использовать некоторую рабочую очередь, например, с помощью превосходного Gearman , который предоставит вам отличный способ отправки фоновых заданий и асинхронного получения их результатов после их обработки.

Преимущество этого, широко используемого в Digg (среди многих других), заключается в том, что он обеспечивает надежный, масштабируемый и надежный способ заставить работников на любом языке говорить с клиентами на любом языке.

ответил Pierre 27 Maypm12 2012, 20:19:50

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132