নোড.জেএস এবং পাইথনের সংমিশ্রণ


127

নোড.জেএস আমাদের ওয়েব প্রকল্পের জন্য একটি নিখুঁত ম্যাচ, তবে কয়েকটি কমপিউটেশনাল কাজ রয়েছে যার জন্য আমরা পাইথনকে পছন্দ করব। তাদের জন্য ইতিমধ্যে আমাদের কাছে পাইথন কোড রয়েছে। আমরা গতি সম্পর্কে অত্যন্ত উদ্বিগ্ন, একটি অজস্র নন-ব্লকিংয়ের পথে নোড.জেএস থেকে পাইথনকে "কর্মী" বলার সর্বাধিক মার্জিত উপায় কী?


3
হাই, আপনি কী বেছে নিয়েছেন এবং কীভাবে এটি আপনার জন্য কার্যকর হয়েছিল তা আমাদের সাথে ভাগ করে নিতে পারেন? পাইথনে লাইব্রেরি রয়েছে যা আমরা সকলেই কার্য সম্পাদন এবং অবরুদ্ধকরণ বিকল্পগুলি রাখার সময় ব্যবহার করতে পছন্দ করি। ধন্যবাদ
মাজিয়ার

কীভাবে কোনও প্রক্রিয়া কাঁটাচামচ করা / কাঁটাচামচ করা এবং সিস্টেম আইও-র মাধ্যমে যোগাযোগ করা যায়, যেমন এটির মতামত : sohamkamani.com/blog/2015/08/21/python-nodejs-comm ?
lkahtz

পাইনোড নামে একটি নতুন ব্রিজিং লাইব্রেরি রয়েছে যা আপনাকে পাইথন কল করতে এবং জেএস টাইপগুলি ফিরে পেতে দেয়। এটি এখানে প্রদর্শিত হচ্ছে codinginterface.com/blog/…
SciGuyMcQ

উত্তর:


86

নোড.জেএস এবং পাইথন সার্ভারের মধ্যে যোগাযোগের জন্য, আমি উভয় প্রক্রিয়া একই সার্ভার এবং টিসিপি / আইপি সকেটে অন্যথায় চালিত হলে আমি ইউনিক্স সকেট ব্যবহার করব। মার্শালিং প্রোটোকলের জন্য আমি জেএসএন বা প্রোটোকল বাফার নেব । থ্রেডযুক্ত পাইথন যদি কোনও বাধা হিসাবে দেখাতে থাকে তবে টুইস্টেড পাইথন ব্যবহার করা বিবেচনা করুন , যা নোড.জেএস-এর মতো একই ইভেন্ট চালিত সমাবর্তন সরবরাহ করে which

আপনি দু: সাহসিক মনে করেন, শিখতে clojure ( clojurescript , clojure-PY ) এবং আপনি একই ভাষা রান এবং জাভা, জাভাস্ক্রিপ্ট উপস্থিত কোড সহ interoperates (অন্তর্ভুক্ত Node.js), CLR এবং পাইথন পাবেন। এবং আপনি কেবল ক্লোজার ডেটা স্ট্রাকচার ব্যবহার করে দুর্দান্ত মার্শেলিং প্রোটোকল পান get


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

বা তদ্বিপরীত, 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");

এবং অজগর ক্লায়েন্ট

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
একাধিক ক্লায়েন্ট সেশন রয়েছে এমন ইভেন্টে জেরারপিসি একাধিক রাজ্য পরিচালনা করতে পারে?
ব্যবহারকারী 1027169

ভাল উত্তর, নমুনা উদাহরণ, প্রচুর ব্যাখ্যা এবং আমি কী খুঁজছিলাম। TY। +1
গৌরব গান্ধী

1
আপনি যদি আমার মতো নতুন হন তবে এখানে উল্লিখিত নির্ভরতাগুলি ইনস্টল করুন - ianhinsdale.com/code/2013/12/08/…
দর্পণ

এটার জন্য অনেক ধন্যবাদ!
গিজিম

1
দুর্দান্ত হ্যালো ওয়ার্ল্ড ডেমো! রাবিটেমকিউ ব্যবহার করে নীচে অন্য অনুরূপ সমাধান। माध्यम.com
টেং

7

যদি আপনি নিজের পাইথন কর্মীকে আলাদা প্রক্রিয়াতে রাখার ব্যবস্থা করেন (হয় দীর্ঘমেয়াদে চলমান সার্ভার-টাইপ প্রক্রিয়া বা চাহিদা অনুসারে একটি স্বতঃস্ফূর্ত শিশু), এর সাথে আপনার যোগাযোগ নোড.জেএস পাশের অ্যাসিক্রোনাস হবে। ইউনিক্স / টিসিপি সকেট এবং স্টিডিন / আউট / এরর যোগাযোগ নোডের মধ্যে সহজাতভাবে অ্যাসিঙ্ক হয়।


6

আমি অ্যাপাচি থ্রাইফট http://thrift.apache.org/ বিবেচনা করব

এটি বেশ কয়েকটি প্রোগ্রামিং ভাষার মধ্যে ব্রিজ করতে পারে, অত্যন্ত দক্ষ এবং অ্যাসিঙ্ক বা সিঙ্ক কলগুলির পক্ষে সমর্থন করে। এখানে সম্পূর্ণ বৈশিষ্ট্য দেখুন http://thrift.apache.org/docs/features/

বহু ভাষা ভবিষ্যতের পরিকল্পনাগুলির জন্য দরকারী হতে পারে, উদাহরণস্বরূপ আপনি যদি পরে সি ++ তে কম্পিউটেশনাল টাস্কের কিছুটা করতে চান তবে থ্রাইফ্ট ব্যবহার করে মিক্সটিতে এটি যুক্ত করা খুব সহজ।


5

Thunk.py এর সাথে thunk.js ব্যবহার করে আমি প্রচুর সাফল্য পেয়েছি । আপনাকে যোগাযোগের জন্য ফিড (প্রকাশ / সাবস্ক্রাইব ভাবেন), সারি এবং কাজের নিদর্শন দেওয়ার জন্য থুনক রেডিস (ইন-মেমরি কী-মান স্টোর) সরবরাহ করে।

এটি ইউনিক্স সকেট বা সরাসরি টিসিপি সকেটের চেয়ে কেন ভাল? সামগ্রিক পারফরম্যান্স কিছুটা হ্রাস পেতে পারে, তবে থুনক একটি সত্যই সহজ এপিআই সরবরাহ করে যা কোনও সকেটের সাথে ম্যানুয়ালি মোকাবেলা করা সহজতর করে। থুনক বিতরণকৃত কম্পিউটিং মডেলটি বাস্তবায়নে সত্যিকার অর্থে তুচ্ছ করে তুলতে সহায়তা করে যা আপনাকে অজগর কর্মীদের কর্মক্ষমতা বাড়াতে স্কেল করতে দেয়, যেহেতু আপনি কেবলমাত্র আপনার অজগর কর্মীদের নতুন উদাহরণ সজ্জিত করেন এবং সেগুলি একই রেডিস সার্ভারের সাথে সংযুক্ত করেন।


3

আমি কিছু কাজের সারি ব্যবহার করার পরামর্শ দিচ্ছি, উদাহরণস্বরূপ, দুর্দান্ত গিয়ারম্যান , যা আপনাকে পটভূমির কাজগুলি প্রেরণের জন্য দুর্দান্ত উপায় সরবরাহ করবে এবং প্রক্রিয়াটি শেষ হওয়ার পরে অ্যাসিঙ্ক্রোনিকভাবে তাদের ফলাফল পাবে।

ডিগ-এ (আরও অনেকের মধ্যে) ভারী ব্যবহৃত এইটির সুবিধাটি হ'ল এটি কোনও শক্তিশালী, স্কেলেবল এবং মজাদার উপায় যে কোনও ভাষায় শ্রমিকদের যে কোনও ভাষায় ক্লায়েন্টের সাথে কথা বলার জন্য তৈরি করে।


1

2019 আপডেট করুন

এটি অর্জনের বিভিন্ন উপায় রয়েছে এবং ক্রমবর্ধমান ক্রমবর্ধমান ক্রমের তালিকাগুলি এখানে রয়েছে

  1. পাইথন শেল, আপনি পাইথন কনসোলে স্ট্রিম লিখবেন এবং এটি আপনাকে পাঠিয়ে দেবে
  2. রেডিস পাব সাব, আপনার নোড জেএস প্রকাশক ডেটা পুশ করার সময় পাইথনে আপনার চ্যানেল শোনাতে পারে
  3. এমন ওয়েবসাইটের সংযোগ যেখানে নোড ক্লায়েন্ট হিসাবে কাজ করে এবং পাইথন সার্ভার বা তদ্বিপরীত হিসাবে কাজ করে
  4. এক্সপ্রেস / ফ্লাস্ক / টর্নেডো ইত্যাদির সাথে এপিআই সংযোগ অন্য কোনও প্রশ্নের জন্য উন্মুক্ত কোনও এপিআই এন্ডপয়েন্ট সহ আলাদাভাবে কাজ করা

1 পাইথন শেল সহজ পদ্ধতির কাছে যান

উত্স.জেএস ফাইল

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

নোটস : গ্রাহক নামে একটি ফোল্ডার তৈরি করুন যা উত্স.জেএস ফাইলের সমান স্তরে রয়েছে এবং এর মধ্যে গন্তব্য.পি স্থাপন করুন। আপনার ভ্যাচুয়ালেভ পরিবেশ পরিবর্তন করতে ভুলবেন না

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.