サードパーティのデータ サプライヤーはデータと Python を一緒にカプセル化しており、データ クエリは Python メソッドを呼び出すことによってのみ実装できます。Python メソッド呼び出しを単純な Node カプセル化によって実装できれば、すぐに起動でき、開発コストを節約できます。 最も単純かつ大雑把な通信方法は、Nodejs が Python スクリプトを呼び出して、子プロセスの出力を取得することです。ただし、Python を起動してその都度データ パケットをロードするプロセスは比較的長いため、このプロセスは最適化されています。 プロセスコミュニケーションインデックス.py # カプセル化された Python パッケージ、サイズが大きい from mb import MB # データパケットからのクエリ mbe.get('1.0.1.0') インデックス const { spawn } = require('child_process'); python3 を ls で生成します。 ls.stdout.on('データ', (データ) => { console.log(`stdout: ${data}`); }); ls.stderr.on('データ', (データ) => { コンソールエラー(`stderr: ${data}`); }); ls.on('close', (コード) => { console.log(`子プロセスはコード $[code] で終了しました`); }); child_process.spawn を使用して Python サブプロセスを生成し、stdout 出力をリッスンします。上記の方法は公式ドキュメントの例でもあります。現在、この例には 2 つの問題があります。
プロセス間の双方向通信データを一度ロードして複数回使用できることを保証するための前提は、Python プロセスが開始後に終了できないことです。 Python プロセスが終了する理由は、何もすることがないからなので、一般的な方法としては、ループ、スリープ、ポートのリッスンなどがあります。これらの方法は、同期ブロッキングタスクと同期ノンブロッキングタスクに変換できます。このうち最もコストがかからないのは、同期ノンブロッキングタスクです。すると、Linux の select と epoll が考えられます。Python の epoll を簡単に検索したところ、ネイティブパッケージがあるようです。 index.py - epoll 経由で stdin をリッスンします インポートシステム fcntl をインポートする インポート選択 mbからインポートMB jsonをインポート mbe = MB('./データ') # epoll モデル fd = sys.stdin.fileno() epoll = select.epoll() epoll.register(fd、select.EPOLLIN) 関数は、 試す: 真の場合: events = epoll.poll(10) # 同期非ブロッキングデータ = '' fileno、events 内の event の場合: data += sys.stdin.readline() # data == '' または data == '\n' の場合、標準入力からデータを取得します。 続く items = xxx # アイテム内のアイテムの数値処理: 結果 = mbe.get(アイテム) sys.stdout.write(json.dumps(result, ensure_ascii=False) +'\n') # 標準出力に書き込むsys.stdout.flush() # バッファを更新最後に: epoll.unregister(fd) epoll.close() index.js - stdin 経由でデータを送信する 定数 child_process = require('child_process'); python3 の子プロセスを作成します。 コールバックを [] とします。 チャンク=Buffer.alloc(0), チャンクArr = [], データ = ''、 onwork = false; // バッファは動的に拡張できません child.stdout.on('data', (chunk) => { chunkArr.push(チャンク) if (onwork) 戻り値; オンワーク = true; while(chunkArr.length) { チャンク = Buffer.concat([チャンク、chunkArr.pop()]); 定数長さ = チャンク.長さ; trunkAt = -1 とします。 for(const [k, d] of chunks.entries()) { if (d == '0x0a') { // 0a で終了 data += chunks.slice(trunkAt+1, trunkAt=k); const cb = コールバック.shift(); cb(null, データ === 'null' ? null : データ ) データ = ''; } } トランクサイズ < 長さの場合 チャンク = chunks.slice(trunkAt+1) } } オンワーク = false; }) 間隔を設定する(() => { if (callbacks.length) child.stdin.write(`\n`); // Nodejs 側には標準入出力のフラッシュメソッドがないので、ハックを使うしかありません。Python は書き込み後に最新のデータを間に合うように取得できません。}, 500) exports.getMsg = 関数 getMsg(ip, cb) { コールバック.push(cb) child.stdin.write(`${ip}\n`); // 子プロセスの標準入力にデータを書き込みます} Python と Nodejs は stdio を介して通信します。Python は、メモリ常駐と長期操作を実現するために、epoll を介して stdin をリッスンします。 問題
要約するNodejs と Python 間の双方向通信は実現できますが、前述の問題のため、この方法はここでは推奨されません。HTTP または Socket の方がはるかに優れています。 NodejsとPythonの双方向通信の実装コードに関するこの記事はこれで終わりです。NodejsとPythonの双方向通信に関するより関連性の高いコンテンツについては、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Docker を使用して nginx で tomcat クラスターを構築する方法 (画像とテキスト付き)
>>: MYSQL トランザクション チュートリアル Yii2.0 マーチャント引き出し機能
基礎位置の一致順序は、「最初に正規表現に一致し、次に共通表現に一致」です。実際のロケーションの一致順...
基本概念現在の読み取りとスナップショットの読み取りMVCC では、読み取り操作はスナップショット読み...
<br />今日、新しくなった ChinaUI.com の Web サイトを見たのですが...
目次(I) Workbenchを使用してデータベースを操作する①データベースを作成する② データベー...
この記事では、例を使用して、MySQL の継続的な集計の原理と使用方法を説明します。ご参考までに、詳...
目次1. 属性を追加する2. 複数のオブジェクトを結合する3. オブジェクトのプロパティを削除する4...
setinterval を使用すると、ページを開いた直後に 1 秒の遅延後に実行されることがわかりま...
LAN 内のマシンは外部ネットワークにアクセスできますが、外部ネットワークは内部ネットワークにアクセ...
均等に分散されたレイアウトの場合、通常はネガティブ マージン方式を使用します。次の図は平均的なレイア...
1. クロスドメインを実現するためにCORSレスポンスヘッダーを設定するクロスオリジンリソース共有...
この記事は主に、nginx を介して方向プロキシを実装するプロセスを紹介します。この記事のサンプル ...
目次質問1件2つの方法3 実験結果と考察質問1件ご存知のとおり、 Pycharm 、 IDLE 、 ...
これを実現するには、ES6 モジュール開発とオブザーバー モードを使用します。オブザーバー パターン...
1. cuda10.1をダウンロードします。 NVIDIA 公式ウェブサイト リンク: https:...
最近、MySQL オンラインでいくつかのデータ異常が発生しましたが、すべて早朝に発生しました。ビジネ...