Node.js adalah pasangan yang sempurna untuk proyek web kami, tetapi ada beberapa tugas komputasi yang kami inginkan untuk Python. Kami juga sudah memiliki kode Python untuk mereka. Kami sangat memperhatikan kecepatan, apa cara paling elegan untuk memanggil "pekerja" Python dari node.js dengan cara non-pemblokiran yang tidak sinkron?
127
Jawaban:
Untuk komunikasi antara node.js dan server Python, saya akan menggunakan soket Unix jika kedua proses berjalan pada server yang sama dan soket TCP / IP sebaliknya. Untuk protokol marshaling saya akan mengambil JSON atau buffer protokol . Jika Python berulir muncul menjadi hambatan, pertimbangkan untuk menggunakan Twisted Python , yang menyediakan konkurensi yang didorong oleh peristiwa yang sama seperti yang dilakukan node.js.
Jika Anda merasa ingin bertualang, pelajari clojure ( clojurescript , clojure-py ) dan Anda akan mendapatkan bahasa yang sama yang berjalan dan berinteroperasi dengan kode yang ada di Java, JavaScript (termasuk node.js), CLR dan Python. Dan Anda mendapatkan protokol marshalling yang luar biasa hanya dengan menggunakan struktur data clojure.
sumber
Ini terdengar seperti skenario di mana zeroMQ akan cocok. Ini adalah kerangka kerja perpesanan yang mirip dengan menggunakan soket TCP atau Unix, tetapi jauh lebih kuat ( http://zguide.zeromq.org/py:all )
Ada perpustakaan yang menggunakan zeroMQ untuk menyediakan kerangka kerja RPC yang bekerja dengan cukup baik. Ini disebut zeroRPC ( http://www.zerorpc.io/ ). Inilah dunia halo.
Server Python "Hello x":
Dan klien node.js:
Atau sebaliknya, server node.js:
Dan klien python
sumber
Jika Anda mengatur agar pekerja Python Anda dalam proses yang terpisah (baik proses tipe server yang berjalan lama atau anak yang dilahirkan atas permintaan), komunikasi Anda dengannya akan tidak sinkron di sisi node.js. Soket UNIX / TCP dan komunikasi stdin / out / err secara inheren async dalam node.
sumber
Saya juga akan mempertimbangkan Apache Thrift http://thrift.apache.org/
Ini dapat menjembatani antara beberapa bahasa pemrograman, sangat efisien dan memiliki dukungan untuk panggilan sinkronisasi atau async. Lihat fitur lengkap di sini http://thrift.apache.org/docs/features/
Multi bahasa dapat berguna untuk rencana masa depan, misalnya jika Anda kemudian ingin melakukan bagian dari tugas komputasi dalam C ++, sangat mudah untuk menambahkannya ke dalam campuran menggunakan Thrift.
sumber
Saya sudah banyak sukses menggunakan thoonk.js bersama dengan thoonk.py . Thoonk memanfaatkan Redis (in-memory key-value store) untuk memberi Anda umpan (pikirkan publikasi / berlangganan), antrian dan pola pekerjaan untuk komunikasi.
Mengapa ini lebih baik daripada soket unix atau soket tcp langsung? Kinerja keseluruhan mungkin sedikit menurun, namun Thoonk menyediakan API yang sangat sederhana yang menyederhanakan harus berurusan dengan soket secara manual. Thoonk juga membantu menjadikannya sangat sepele untuk mengimplementasikan model komputasi terdistribusi yang memungkinkan Anda untuk meningkatkan skala pekerja python Anda untuk meningkatkan kinerja, karena Anda hanya memutar-mutar instance baru dari pekerja python Anda dan menghubungkannya ke server redis yang sama.
sumber
Saya akan merekomendasikan menggunakan beberapa antrian kerja menggunakan, misalnya, Gearman yang sangat baik , yang akan memberi Anda cara yang hebat untuk mengirimkan pekerjaan latar belakang, dan secara tidak sinkron mendapatkan hasilnya setelah diproses.
Keuntungan dari ini, banyak digunakan di Digg (di antara banyak lainnya) adalah bahwa ia menyediakan cara yang kuat, terukur dan kuat untuk membuat pekerja dalam bahasa apa pun untuk berbicara dengan klien dalam bahasa apa pun.
sumber
Perbarui 2019
Ada beberapa cara untuk mencapai hal ini dan berikut adalah daftar dengan urutan kompleksitas yang meningkat
Pendekatan 1 Pendekatan Python Shell Sederhana
file source.js
file destination.py
Catatan : Buat folder yang disebut pelanggan yang setingkat dengan file source.js dan masukkan destination.py di dalamnya. Jangan lupa untuk mengubah lingkungan virtualenv Anda
sumber