नोड.जेएस और पायथन का संयोजन


127

Node.js हमारी वेब परियोजना के लिए एक आदर्श मैच है, लेकिन कुछ कम्प्यूटेशनल कार्य हैं जिनके लिए हम पायथन को प्राथमिकता देंगे। हमारे पास पहले से ही उनके लिए एक पायथन कोड है। हम गति के बारे में अत्यधिक चिंतित हैं, एक अतुल्यकालिक गैर-अवरुद्ध तरीके से नोड.जेएस से पायथन "कार्यकर्ता" को कॉल करने का सबसे सुरुचिपूर्ण तरीका क्या है?


3
नमस्ते, क्या आप हमारे साथ साझा कर सकते हैं कि आपने क्या चुना और यह आपके लिए कैसे काम किया? पाइथन में पुस्तकालय हैं जो हम सभी को प्रदर्शन और गैर-अवरुद्ध विकल्पों को ध्यान में रखते हुए उपयोग करना पसंद करते हैं। धन्यवाद
Maziyar

क्या बस एक प्रक्रिया के बारे में स्पॉन / फोर्क और सिस्टम IO के माध्यम से संवाद करते हैं, जैसे कि यह सुझाव देता है: sohamkamani.com/blog/2015/08/21/python-nodejs-comm ?
lkahtz

PyNode नाम की एक नई ब्रिजिंग लाइब्रेरी है जो आपको Python को कॉल करने और JS प्रकार वापस करने की अनुमति देती है। यह यहाँ दिखाया गया है thecodinginterface.com/blog/…
SciGuyMcQ

जवाबों:


86

नोड.जेएस और पायथन सर्वर के बीच संचार के लिए, यदि दोनों प्रक्रियाएं एक ही सर्वर और टीसीपी / आईपी सॉकेट पर चलती हैं तो मैं यूनिक्स सॉकेट्स का उपयोग करेगा। मार्शलिंग प्रोटोकॉल के लिए मैं JSON या प्रोटोकॉल बफर लेगा । यदि पिरोया पिरोया एक अड़चन दिखाता है, तो ट्विस्टेड पायथन का उपयोग करने पर विचार करें , जो नोड के रूप में एक ही घटना संचालित संगति प्रदान करता है।

आप साहसी महसूस करते हैं, जानने के clojure ( clojurescript , clojure-py ) और आप एक ही भाषा है कि रन और जावा, जावास्क्रिप्ट पर मौजूदा कोड के साथ interoperates (शामिल Node.js), CLR और अजगर मिल जाएगा। और आप केवल क्लोजर डेटा संरचनाओं का उपयोग करके शानदार मार्शेलिंग प्रोटोकॉल प्राप्त करते हैं।


2
क्या आप जानते हैं कि क्या कुछ ऐसा ही हरोकू पर काम करेगा, जिसमें एक अल्पकालिक फाइलसिस्टम है?
सेमी 2

119

यह एक परिदृश्य की तरह लगता है, जहां शून्यएमक्यू एक अच्छा फिट होगा। यह एक मैसेजिंग फ्रेमवर्क है जो टीसीपी या यूनिक्स सॉकेट का उपयोग करने के समान है, लेकिन यह बहुत अधिक मजबूत है ( http://zguide.zeromq.org/py:all )

एक पुस्तकालय है जो एक आरपीसी फ्रेमवर्क प्रदान करने के लिए शून्यएमक्यू का उपयोग करता है जो बहुत अच्छी तरह से काम करता है। इसे ज़ीरोपीसी ( http://www.zerorpc.io/ ) कहा जाता है । यहाँ नमस्ते दुनिया है।

पायथन "हैलो एक्स" सर्वर:

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()

और नोड.जेएस क्लाइंट:

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);
});

या इसके विपरीत, नोड। जेएस सर्वर:

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");

और अजगर ग्राहक

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)

4
क्या zerorpc कई राज्यों को संभाल सकता है, जिसमें कई ग्राहक सत्र हैं?
user1027169

अच्छा जवाब, नमूना उदाहरण, भरपूर मात्रा में स्पष्टीकरण और मैं क्या देख रहा था। स्व। +1
गौरव गांधी

1
यदि आप मेरे जैसे नए हैं, तो उनके द्वारा बताई गई निर्भरताएँ यहाँ स्थापित करें - ianhinsdale.com/code/2013/12/08/…
Darpan

इसके लिए बहुत - बहुत धन्यवाद!
गीतिम

1
अच्छा हैलो विश्व डेमो! Rabbitmq का उपयोग करके नीचे एक और समान समाधान। medium.com/@HolmesLaurence/…
टेंग

7

यदि आप अपने पायथन कार्यकर्ता को एक अलग प्रक्रिया (या तो लंबे समय से चल रहे सर्वर-टाइप प्रक्रिया या मांग पर एक स्पॉन्ड बच्चा) की व्यवस्था करते हैं, तो इसके साथ आपका संचार नोड के पक्ष में अतुल्यकालिक होगा। UNIX / टीसीपी सॉकेट और स्टडिन / आउट / गलत संचार नोड में स्वाभाविक रूप से एसिंक्स हैं।


6

मैं अपाचे थ्रिफ्ट http://thrift.apache.org/ पर भी विचार करूंगा

यह कई प्रोग्रामिंग भाषाओं के बीच पुल कर सकता है, अत्यधिक कुशल है और इसमें async या सिंक कॉल के लिए समर्थन है। यहां देखें पूरी सुविधाएं http://thrift.apache.org/docs/features/

बहु भाषा भविष्य की योजनाओं के लिए उपयोगी हो सकती है, उदाहरण के लिए यदि आप बाद में सी ++ में कम्प्यूटेशनल कार्य का हिस्सा बनाना चाहते हैं तो थ्रिफ्ट का उपयोग करके इसे मिश्रण में जोड़ना बहुत आसान है।


5

मुझे thoonk.py के साथ-साथ thoonk.js का उपयोग करने में बहुत सफलता मिली है । थूनक संचार के लिए रेडिस (इन-मेमरी की-वैल्यू स्टोर) को आपको फीड (थिंक पब्लिश / सब्सक्राइब), कतार और जॉब पैटर्न देने के लिए लेती है।

यह यूनिक्स सॉकेट्स या डायरेक्ट टीसीपी सॉकेट्स से बेहतर क्यों है? कुल मिलाकर प्रदर्शन को थोड़ा कम किया जा सकता है, हालांकि थूनक वास्तव में सरल एपीआई प्रदान करता है जो सॉकेट के साथ मैन्युअल रूप से निपटने के लिए सरल करता है। थूनक एक वितरित कंप्यूटिंग मॉडल को लागू करने के लिए वास्तव में तुच्छ बनाने में मदद करता है जो आपको प्रदर्शन को बढ़ाने के लिए अपने अजगर श्रमिकों को स्केल करने की अनुमति देता है, क्योंकि आप अपने अजगर श्रमिकों के नए उदाहरणों को स्पिन करते हैं और उन्हें उसी रेडिस सर्वर से कनेक्ट करते हैं।


3

मैं उदाहरण के लिए, उत्कृष्ट गियरमैन का उपयोग करके कुछ कार्य कतार का उपयोग करने की सलाह दूंगा , जो आपको पृष्ठभूमि की नौकरियों को भेजने का एक शानदार तरीका प्रदान करेगा, और संसाधित होने के बाद एसिंक्रोनस रूप से अपना परिणाम प्राप्त करेंगे।

इसका लाभ, डिग में (कई अन्य लोगों के बीच) इस्तेमाल किया गया है, यह किसी भी भाषा में श्रमिकों को किसी भी भाषा में ग्राहकों के साथ बात करने के लिए एक मजबूत, स्केलेबल और मजबूत तरीका प्रदान करता है।


1

अपडेट 2019

इसे प्राप्त करने के कई तरीके हैं और यहां जटिलता के बढ़ते क्रम में सूची दी गई है

  1. पायथन शेल, आप पायथन कंसोल को स्ट्रीम लिखेंगे और यह आपको वापस लिख देगा
  2. रेडिस पब सब, आप एक चैनल सुन सकते हैं जब पायथन आपके नोड जेएस प्रकाशक डेटा को धक्का देता है
  3. Websocket कनेक्शन जहां Node क्लाइंट के रूप में कार्य करता है और पायथन सर्वर या इसके विपरीत कार्य करता है
  4. एपीआई / एक्सप्रेस / फ्लास्क / बवंडर आदि के साथ एपीआई कनेक्शन एक एपीआई एंडपॉइंट के साथ अलग से काम कर रहा है जो दूसरे को क्वेरी के लिए उजागर करता है

दृष्टिकोण 1 पायथन शैल सरलतम दृष्टिकोण

source.js फ़ाइल

const ps = require('python-shell')
// very important to add -u option since our python script runs infinitely
var options = {
    pythonPath: '/Users/zup/.local/share/virtualenvs/python_shell_test-TJN5lQez/bin/python',
    pythonOptions: ['-u'], // get print results in real-time
    // make sure you use an absolute path for scriptPath
    scriptPath: "./subscriber/",
    // args: ['value1', 'value2', 'value3'],
    mode: 'json'
};

const shell = new ps.PythonShell("destination.py", options);

function generateArray() {
    const list = []
    for (let i = 0; i < 1000; i++) {
        list.push(Math.random() * 1000)
    }
    return list
}

setInterval(() => {
    shell.send(generateArray())
}, 1000);

shell.on("message", message => {
    console.log(message);
})

गंतव्य फ़ाइल

import datetime
import sys
import time
import numpy
import talib
import timeit
import json
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

size = 1000
p = 100
o = numpy.random.random(size)
h = numpy.random.random(size)
l = numpy.random.random(size)
c = numpy.random.random(size)
v = numpy.random.random(size)

def get_indicators(values):
    # Return the RSI of the values sent from node.js
    numpy_values = numpy.array(values, dtype=numpy.double) 
    return talib.func.RSI(numpy_values, 14)

for line in sys.stdin:
    l = json.loads(line)
    print(get_indicators(l))
    # Without this step the output may not be immediately available in node
    sys.stdout.flush()

नोट्स : सब्सक्राइबर नामक एक फोल्डर बनाएं, जो source.js फ़ाइल के समान स्तर पर हो और इसके अंदर डेस्टिनेशन को डालें। अपने virtualenv पर्यावरण को बदलने के लिए मत भूलना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.