問題タブ [node-fibers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
1432 参照

javascript - Meteor(Fibers)ループとコールバック

流星繊維の「同期」モードは私を夢中にさせています。簡単なコード例を次に示します。

これを機能させる方法がわかりません。ループが終了した後にコールバックが呼び出されますが、フィードなどの内部内部変数は保持する必要があります...そしてそれらは保持されません。

解析されたURLは適切です(最初のURL、次に2番目のURL)が、コールバックに適切な_idがないため、データを更新できません。

必要な出力は、「1234」「0」と「6789」「1」であり、どちらも「6789」「2」ではありません... Meteor /ファイバーコードでこれをどのように作成しますか?

0 投票する
2 に答える
766 参照

meteor - Modulus.io で Meteor アプリのノードファイバーを再インストールしますか?

Heroku から Modulus.io に Meteor アプリケーションを移植しようとしています (スティッキー セッションと水平スケーリングをテストできることを願っています)。次の記事とリポジトリで詳しく説明されているように、Modulus.io スクリプトを使用してアプリを分解しました。

https://github.com/onmodulus/demeteorizer
http://blog.modulus.io/demeteorizer

隕石を降ろした後、圧縮してアップロードしたところ、空のデプロイ ログとブラウザーに白い画面が表示されました。もう少し調査した後、結果の demeteorized アプリケーションで node_modules ディレクトリを削除し、圧縮してアップロードしました。すべてが展開を開始し、ログがビジー状態になったため、これは間違いなく正しい動きのように思われました。

ここに私が思いついたエラーがあります:

Demeteorized Meteor アプリを使用して、Modulus.io 環境で「ノードファイバーを再インストール」する方法を知っている人はいますか? 私はここで自分のリーグから抜け出そうとしていますが、どうすればよいかわかりません。

ご意見やご提案をお寄せいただきありがとうございます。

0 投票する
1 に答える
1153 参照

node.js - setTimeout でスケジュールされた Node.js ファイバーとコードがクラッシュする

いくつかの同期コードの実行を一時停止して、node.js のイベント ループに制御を渡す方法に関する問題を解決するためにファイバーを使用しています。これはほとんどうまくいきますが、奇妙なクラッシュに遭遇しましたが、その理由を見つけることができません。

設定

次の 3 つのプロセスがあります。

  • メインのサーバー プロセスであり、計測および実行するコードを受け取ります。実行する新しいコードを受け取ったら、child_process.fork() を使用して生成します
  • 実行プロセス。これは、実行されたコードで何が起こったかを報告するために、特定のコールバックを時々呼び出すように受信コードをインストルメント化します。次に、 Contextifyを使用して作成されたサンドボックスでコードを実行します。これらのレポートには、コード内の行と列に関する誤った位置情報が含まれていることがあります。その場合、インストルメント化されたコード内の場所を元のコード内の場所にマップするためのソース マップが必要です。ただし、このソース マップの計算にはかなりの時間がかかります。したがって、実行を開始する前に、実行プロセスが生成されます
  • ソース マップの計算プロセス。これは、元のコードとインストルメント化されたコードを取り、ソース マップを計算するだけです。完了すると、完成したソース マップを実行プロセスに送信して終了します。

実行プロセスが、実行が完了する前にコールバックでソース マップを必要とする場合、Fiber.yield() を使用して制御をイベント ループに渡し、実行を一時停止します。実行プロセスがデータを受け取ると、pausedFiber.run() を使用して実行を続行します。

これは次のように実装されます。

要約すると、新しいコードを受け取ると、それを実行するための新しいプロセスが作成されます。このプロセスは、最初に計測してから実行します。その前に、コードのソース マップを計算する 3 番目のプロセスを開始します。インストルメント化されたコードは、次の名前の関数を呼び出しますcallback上記のコードで、実行中のコードの進行状況を報告するメッセージをランタイムに渡します。これらは時々調整する必要があります。調整が必要な例の 1 つは、「コンソール ログ」メッセージです。この調整を行うには、3 番目のプロセスで計算されたソース マップが必要です。コールバックがソース マップを必要とする場合、getSourceMap() を呼び出します。これは、sourceMap プロセスが計算を終了するのを待機し、その待機時間中にイベント ループに制御を渡し、sourceMap プロセスからメッセージを受信できるようにします (それ以外の場合、イベント ループはブロックされ、メッセージを受信できませんでした)。

コールバックに渡されたメッセージは、最初に配列に格納されてから、パフォーマンス上の理由からメイン プロセスにバッチとして送信されます。ただし、メイン プロセスがメッセージを長時間待機することは望ましくないため、しきい値に達したときにメッセージのバッチを送信することに加えてsendMessagesWithEventLoopTurnAround()、イベント ループで実行する関数をスケジュールし、送信するメッセージがあるかどうかを確認します。これには 2 つの利点があります。

  1. 実行プロセスがソース マップ プロセスを待機している場合、その時間を使用して、既に取得したメッセージを送信できます。そのため、sourceMap プロセスが終了するまでに数秒かかる場合、メイン プロセスは、作成済みで正しいデータを含むメッセージを同じ時間待機する必要はありません。
  2. 実行中のコードがイベント ループでごくわずかなメッセージしか生成しない場合 (たとえば、setTimeInterval(f, 2000)実行ごとに 1 つのメッセージのみを作成するようにスケジュールされた関数によって)、メッセージ バッファーがいっぱいになるまで長時間 (この例では 200 秒) 待機する必要はありません。ただし、10ms ごとに進行状況に関する更新を受信します (何かが変更された場合)。

問題

機能するもの

このセットアップは、次の場合にうまく機能します

  1. ソース マップを計算するために、ファイバーや別のプロセスは使用しません。代わりに、コードが実行される前にソース マップを計算します。その場合、実行しようとしたすべてのコードが期待どおりに機能します。
  2. 私はファイバーと別のプロセスを使用し、ソース マップを必要としないコードを実行します。たとえば var a = 2;
    、または
    setTimeout(function () { var a = 2;}, 10)

最初のケースでは、出力は次のようになります。

  1. ファイバーと、ソースマップが必要な別のプロセスとコードを使用しますが、イベントループは使用しません。 console.log("foo");

その場合、出力は次のようになります。

  1. 私はファイバーと、ソース マップが必要でイベント ループを使用する別のプロセスとコードを使用しますが、ソース マップは、ソース マップの計算が既に完了している場合にのみ必要です (つまり、待機はありません)。

例えば

その場合、出力は次のようになります。

うまくいかないこと

ファイバーを使用し、イベントループを使用するプロセスとコードを分離した場合にのみ壊れますが、終了する前にソースマップが必要です。

出力は次のようになります。

ここでクラッシュするプロセスが実行プロセスです。しかし、なぜそれが起こるのか、問題を追跡する方法がわかりません。上記でわかるように、何が起こっているのかを調べるために、いくつかのログ ステートメントを既に追加しています。実行プロセスで「キャッチされていない例外」イベントも聞いていますが、それは発生していないようです。

また、最後に表示されるログ メッセージは私のものではありません。ログ メッセージの前に何らかの説明文字列を付けているため、node.js 自体によって作成されたものです。なぜこれが発生するのか、どの終了コード 8 なのか、あるいは原因を絞り込むために他に何ができるのかさえわかりません。どんな助けでも大歓迎です。

0 投票する
1 に答える
445 参照

mongodb - Meteor サーバーにデプロイする場合、Meteor コードは常にファイバー内で実行する必要があります。

アプリを meteor クラウド サーバーにデプロイすると、このエラーが発生し続けました。

Meteor コードは常に _.extend.get (app/packages/meteor/dynamics_nodejs.js:14:13) のファイバー内で _.extend.apply (app/packages/livedata/livedata_server.js:1268:57) で実行する必要があります。 _.extend.call (app/packages/livedata/livedata_server.js:1229:17) で Meteor.startup.Meteor.methods.streamTwit (app/server/server.js:50:24) で

ただし、私はすでにファイバー内にラップしています

理由はわかりませんが、代わりに Meteor.bindEnvironment でラップする必要があると誰かが提案しました。したがって、私はこれをしました:

//質問メソッドを追加

しかし、今では機能しません。これは、データを mongodb に挿入しようとしたときにのみ発生したことに気付きました。私のコードの問題は何ですか?ありがとう!これらのコードはすべて app/server/server.js に記述されています

0 投票する
4 に答える
4698 参照

meteor - ファイバー モジュールに関連する Meteor 展開の問題

meteor を展開しようとしているときに、次の方法でノード ファイバーをインストールします。

次にファイバーを取り付けます

インストールされているようですが、次のメッセージが表示されます。

ただし、次を使用してコードをデプロイするとき:

次のエラーが表示されます。

linux-x64-v8-3.xx のバージョンが異なることがわかります。Ubuntu 13.04 を使用しています

ノードのバージョンは v0.11.3、NPM のバージョンは 1.2.18

0 投票する
1 に答える
1066 参照

javascript - サーバーメソッドの外で setPassword を使用する方法

メテオ サーバー メソッドの外部で Accounts.setPassword を使用する必要がありますが、サーバー側で使用する必要があります。この場合のコレクションでは、ファイバー ラッパーを使用しますが、Accounts.setPassword では機能しません。

0 投票する
1 に答える
530 参照

node.js - それぞれの後に meteor.js ファイバーコールバック

_.eachが完了した後にいくつかの関数を呼び出そうとしています...私はファイバーでそれをやろうとしています。しかし、underscore.js AFTER メソッドでそれを行う方法を教えていただければ、私も満足します。

今のところ私はこれを持っています:

そして、どこかに fiber.run() も配置する必要がありますか? しかし、私はどこかわからない。

繰り返しますが、いくつかの関数を呼び出したいとします。各ループが完了すると、finished() と言うことができます。