2016-03-27 10 views
0

私はnetソケットからpythonソケットに通信しているnode.jsサーバーを持っています。ユーザーがデータとともに非同期のAjaxリクエストを送信すると、ノードサーバーはそれをPythonに渡し、サーバーにデータを戻し、そこからクライアントにデータを戻します。Node.js長期のタスク

問題は、ユーザーがajaxリクエストを送信したときに発生します。応答を待つ必要があり、Pythonプロセスに時間がかかり過ぎると、ajaxはすでにタイムアウトしています。

私はnode.jsにソケットサーバーを作成しようとしました。そして、処理するデータとともにpythonでソケットサーバーに接続するクライアントを作成しようとしました。ノードサーバーは、クライアントに読み込み画面を表示します。データが処理されると、pythonソケットクライアントはnode.jsソケットサーバーに接続し、処理されたデータを渡します。しかし、クライアントは処理されたデータを要求することはできません。

+0

なぜpythonとnode.jsの両方を使用する必要がありますか?実際に行っているPythonサービスは何ですか? –

+0

あなたの質問はあまりにも悪いことではありません。私たちはあなたを助けるためにそれを編集しました。スタックオーバーフローへようこそ:) –

+0

@timOgilvy助けてくれてありがとう。私はPythonサービスについて今は話すことができませんが、それは必要です。主な目的は、クライアントがフォームを送信し、彼が表示するpythonサービスデータから取得することです。 – Grndhck

答えて

0

したがって、3つのシステムと非同期要求があります。私はこのような問題をPHPとbox.com APIを使って最近解決しました。 PHPでは、接続を無期限に開いておくことはできません。同様の問題がありました。

問題を解決するために、再帰的なリクエストを使用します。それは「リアルタイム」ではありませんが、それは問題ではありません。

この仕組み:

  1. クライアントブラウザは、Node.jsのサーバーに「マイダウンロード事を入手」要求を送信します。 Node.jsサーバーは、クライアントブラウザーに固有の要求IDを返します。
  2. クライアントブラウザは、一意の要求IDを使用して何か変更があったかどうかを確認するために、10秒間のポーリングを開始します。現在のところ、答えは「いいえ」です。
  3. Node.jsサーバーはこれを受け取り、「ダウンロードしてください」リクエストをPythonサーバーに送信します。
  4. pythonサーバーは実際にダウンロードして取得し、場所に貼り付け、URLを作成してNode.jsサーバーに返します。これは、クライアントのブラウザでは10秒ごとにポーリングされます。 (クライアントブラウザはまだ10秒ごとにポーリングしていますが、答えはまだノーです)
  5. Node.jsサーバーは、URLを使ってPythonサーバーからメッセージを受信します。これは、開始したリクエストIDに対するURLを格納します。

  6. クライアントブラウザは、URL付きの素敵なデータパケットを受信し、ポーリングを中止し、幸いにスキップするようになりました。この時点で、状態は「はい、ダウンロードしました。離れて日没に。(または類似したより適切なデジタル対応)。

が、これはあなたがプッシュ技術に依存せずに、この問題を解決する方法をの大まかなアイデアを与えるのに役立ちます願っています。あなたのポーリング間隔を微調整を検討(Iダウンロードにかかる時間に応じて10秒間の起動を推奨)、トリッキーになって30秒待ってから2秒ごとにポーリングしても問題が解決しない場合は、

+0

と便利ですたとえば、jquery ajaxリクエストを使用してリクエストを繰り返す 'on fail function'を使用すると、応答が「リクエスト・タイムアウト」であれば、それはただちに再び実行されます。 –