Node.js doskonale pasuje do naszego projektu internetowego, ale jest kilka zadań obliczeniowych, dla których wolelibyśmy Python. Mamy też już dla nich kod w Pythonie. Jesteśmy bardzo zaniepokojeni szybkością. Jaki jest najbardziej elegancki sposób wywoływania „pracownika” Pythona z node.js w sposób asynchroniczny i nieblokujący?
127
Odpowiedzi:
Do komunikacji między node.js a serwerem Python użyłbym gniazd Unix, jeśli oba procesy działają na tym samym serwerze, a gniazda TCP / IP w przeciwnym razie. Dla protokołu kierowania wziąłbym JSON lub bufor protokołu . Jeśli wątkowym Python okaże się wąskim gardłem, rozważ użycie Twisted Python , który zapewnia tę samą współbieżność sterowaną zdarzeniami, co node.js.
Jeśli czujesz się na siłach , naucz się clojure ( clojurescript , clojure-py ), a uzyskasz ten sam język, który działa i współpracuje z istniejącym kodem w Javie, JavaScript (w tym node.js), CLR i Pythonie. I otrzymujesz doskonały protokół krosowania, po prostu używając struktur danych clojure.
źródło
Brzmi to jak scenariusz, w którym zeroMQ byłoby dobrym rozwiązaniem. Jest to platforma przesyłania wiadomości podobna do korzystania z gniazd TCP lub Unix, ale jest znacznie bardziej niezawodna ( http://zguide.zeromq.org/py:all )
Istnieje biblioteka, która wykorzystuje zeroMQ, aby zapewnić platformę RPC, która działa całkiem dobrze. Nazywa się zeroRPC ( http://www.zerorpc.io/ ). Oto witaj świecie.
Serwer „Hello x” w Pythonie:
I klient node.js:
Lub odwrotnie, serwer node.js:
I klient Pythona
źródło
Jeśli zaplanujesz, że twój Python Worker będzie miał oddzielny proces (albo długo działający proces typu serwerowego, albo zrodzone dziecko na żądanie), twoja komunikacja z nim będzie asynchroniczna po stronie node.js. Gniazda UNIX / TCP i komunikacja stdin / out / err są z natury asynchroniczne w węźle.
źródło
Rozważyłbym również Apache Thrift http://thrift.apache.org/
Może łączyć kilka języków programowania, jest bardzo wydajny i obsługuje wywołania asynchroniczne lub synchronizacyjne. Zobacz pełne funkcje tutaj http://thrift.apache.org/docs/features/
Wielojęzyczny język może być przydatny w przyszłych planach, na przykład jeśli później chcesz wykonać część zadania obliczeniowego w C ++, bardzo łatwo jest dodać go do mieszanki za pomocą Thrift.
źródło
Odniosłem duży sukces, używając thoonk.js wraz z thoonk.py . Thoonk wykorzystuje Redis (magazyn wartości klucza w pamięci), aby zapewnić kanał (pomyśl o publikowaniu / subskrybowaniu), kolejki i wzorce zadań do komunikacji.
Dlaczego jest to lepsze niż gniazda unix lub bezpośrednie gniazda TCP? Ogólna wydajność może zostać nieco zmniejszona, jednak Thoonk zapewnia naprawdę proste API, które upraszcza konieczność ręcznej obsługi gniazda. Thoonk pomaga również sprawić, że wdrożenie rozproszonego modelu obliczeniowego, który pozwala skalować pracowników Pythona w celu zwiększenia wydajności, jest naprawdę trywialne, ponieważ po prostu uruchamiasz nowe instancje pracowników Python i podłączasz je do tego samego serwera redis.
źródło
Poleciłbym korzystanie z kolejki roboczej , na przykład przy użyciu doskonałego Gearmana , który zapewni Ci świetny sposób na wysyłanie zadań w tle i asynchroniczne uzyskiwanie ich wyników po ich przetworzeniu.
Zaletą tego, często używanego w Digg (między innymi), jest to, że zapewnia silny, skalowalny i niezawodny sposób, aby pracownicy mogli rozmawiać z klientami w dowolnym języku w dowolnym języku.
źródło
Zaktualizuj 2019
Istnieje kilka sposobów osiągnięcia tego celu, a oto lista w kolejności rosnącej złożoności
Podejście 1 Python Shell Najprostsze podejście
plik source.js
plik destination.py
Uwagi : Stwórz folder o nazwie subscriber, który jest na tym samym poziomie co plik source.js i umieść w nim miejsce docelowe.py. Nie zapomnij zmienić swojego środowiska virtualenv
źródło