queue-fun-nodejsの下でPromiseに基づくキューコントロールモジュールです.
9843 ワード
仕事が一段落しました.暇な時は大丈夫です.nodejsで「半閉塞」を実現するためのコントロールプログラムを書きました.
ずっとから、nodejsはシングルラインのプログラムで渋滞しないで、高合併の特性で有名です.この「半閉塞」をするのは何のためですか?
シーン1:
現在のウェブアプリケーションは、すべてこのような構造であることができます.
httpサービス(node)インターフェース(業務ロジック)>データベース
多くの場合、ボトルネックは一般的に業務層やデータ層に現れます.もっと多いのはある業務の処理かもしれません.システム全体の性能を引き落とします.
ユーザーや一部の悪意のある人が、わざとこれらの処理ロジックを大量に呼び出してもいいです.nodejsはブロックされていません.この大きな波の処理要求は業務層に殺到し、システム全体の性能が低下したり、麻痺したりする恐れがあります.
もしこの時、node層はこれらの資源消費の要求を並べて、同時にコントロールして、甚だしきに至ってはユーザーに分けて列を作って、異なった身分のユーザーの合併量を配置します.いいですか
シーン2:
アプリケーションでは、すぐに処理する必要がない同じ種類の業務があるかもしれません.処理前に一度の資源を集めて業務を処理し、処理後にもう一度整理します.高消耗の仕事は主に収集または整理にあります.
この時、私達は処理する業務をしばらく列の中に預けてもいいです.列の数が一つの値またはある時点に達したら、一度にキューの中の任務を処理します.消耗については、一回だけ「収集」、「整理」の操作をします.
小さいプロジェクトの中でもしnodeがスレッドプールのような機能を実現しやすいなら、プロジェクト全体の安定性と作業効率に大きな貢献があることが分かります.
今は私が書いたこの「半閉塞」というものを紹介します.なぜPromiseに基づいていますか?
Q.jsを使ったことがありますか?EC 6を知っているなら、Promiseについて知っているはずです.でないと、先に調べてください.
私の考えでは、業務全体の後続処理を全部列に置く必要はなく、高消耗の部分を列に入れて、Promiseの異部処理機構を利用して後続の操作を処理するだけです.
コードを作成する時は列の存在をほとんど忘れられますが、彼はそこで黙々と作業しています.コードの可読性と柔軟性には影響がありません.
queue-fun
queue-funはPromiseに基づく運転キュー制御類です.
使用シーン巨量同論理業務安定処理 間欠性高合併システム 制御シングルユーザーの占用リソースが高すぎる キュー
queue-fun.Que(q)
キュー制御パラメータを初期化します.パラメータなし キューに内蔵のPromiseを使う. q/ES 6原生Promise キューの挿入方法: リアルキューnew queue-fun.Que()(runMax, コンサートrunMax並列運転キュー方法の最大個数 con配置キュー 始まります イベント、実行ユニットの 失敗する イベントおよび設定実行ユニットのエラー 再試行 メカニズム
queue.push(promisefun) アークス[] コンサート
運転ユニットfun:promise function args:インポートされたパラメータconのデフォルト値をキューに追加します.
queue.go(promisefun) アークス[] con)同じpushで、追加するとキューが起動します.
queue.jump(promisefun) アークス[] con)同じunshiftで、追加後にキューを起動します.
setMax(newMax)
平行数を変更
queue.start()
キューを起動
queue.stop()
キューを一時停止
queue.clear()
列を空にする
デモ
Promises/A+仕様および
.toPromis(obj).then()
もしあなたがコードを書くのに慣れたら、普通の関数/語句をtoPromisで包装してみてください.彼にthenメソッドを獲得して、エラーを捕まえられます.クラスタサポート メモリオーバーフロー隠れ処理 他のPromise実現類のサポート インストール:npm install quque-fun
github: https://github.com/cnwhy/queue-fun
ずっとから、nodejsはシングルラインのプログラムで渋滞しないで、高合併の特性で有名です.この「半閉塞」をするのは何のためですか?
シーン1:
現在のウェブアプリケーションは、すべてこのような構造であることができます.
httpサービス(node)インターフェース(業務ロジック)>データベース
多くの場合、ボトルネックは一般的に業務層やデータ層に現れます.もっと多いのはある業務の処理かもしれません.システム全体の性能を引き落とします.
ユーザーや一部の悪意のある人が、わざとこれらの処理ロジックを大量に呼び出してもいいです.nodejsはブロックされていません.この大きな波の処理要求は業務層に殺到し、システム全体の性能が低下したり、麻痺したりする恐れがあります.
もしこの時、node層はこれらの資源消費の要求を並べて、同時にコントロールして、甚だしきに至ってはユーザーに分けて列を作って、異なった身分のユーザーの合併量を配置します.いいですか
シーン2:
アプリケーションでは、すぐに処理する必要がない同じ種類の業務があるかもしれません.処理前に一度の資源を集めて業務を処理し、処理後にもう一度整理します.高消耗の仕事は主に収集または整理にあります.
この時、私達は処理する業務をしばらく列の中に預けてもいいです.列の数が一つの値またはある時点に達したら、一度にキューの中の任務を処理します.消耗については、一回だけ「収集」、「整理」の操作をします.
小さいプロジェクトの中でもしnodeがスレッドプールのような機能を実現しやすいなら、プロジェクト全体の安定性と作業効率に大きな貢献があることが分かります.
今は私が書いたこの「半閉塞」というものを紹介します.なぜPromiseに基づいていますか?
Q.jsを使ったことがありますか?EC 6を知っているなら、Promiseについて知っているはずです.でないと、先に調べてください.
私の考えでは、業務全体の後続処理を全部列に置く必要はなく、高消耗の部分を列に入れて、Promiseの異部処理機構を利用して後続の操作を処理するだけです.
コードを作成する時は列の存在をほとんど忘れられますが、彼はそこで黙々と作業しています.コードの可読性と柔軟性には影響がありません.
queue-fun
queue-funはPromiseに基づく運転キュー制御類です.
使用シーン
queue-fun.Que(q)
キュー制御パラメータを初期化します.
push
unshift
go
jump
対応のpromiseに戻るvar queue = new queue-fun.Queue()(100,{ "event_succ":function(){} // ,"event_err":function(){} // ,"event_begin":function(){} // ,"event_end":function(){} // ,"event_add":function(){} // , go jump ,"retryON":0 // ,"retryType":0 // true/false( / ) })`
APIqueue.push(promisefun) アークス[] コンサート
運転ユニットfun:promise function args:インポートされたパラメータconのデフォルト値をキューに追加します.
{
'event_succ':null // , , then ,'event_err':null // , , then ,'Queue_event':true // }
queue.unshift(promisefun) アークス[] con)同じpushで列の先頭に運転ユニットを追加します.queue.go(promisefun) アークス[] con)同じpushで、追加するとキューが起動します.
queue.jump(promisefun) アークス[] con)同じunshiftで、追加後にキューを起動します.
setMax(newMax)
平行数を変更
queue.start()
キューを起動
queue.stop()
キューを一時停止
queue.clear()
列を空にする
デモ
var queuefun = require('queue-fun'); // // Promise var Queue = queuefun.Queue(); // 2 var queue1 = new Queue(2,{ "event_succ":function(data){console.log('queue-succ:',data)} // ,"event_err":function(err){console.log('queue-succ:',data)} // }); var q = queuefun.Q; // Q , , // Promise function testfun(i){ var deferred = q.defer(); setTimeout(function(){ if(i\ && i % 3 == 0){ deferred.reject(new Error("err " + i)) }else{ deferred.resolve(i) } },(Math.random() * 2000)>>0) return deferred.promise; } // queue1.push(testfun,[1]) // queue1.go(testfun,[2]) // queue1.go(testfun,[3],{Queue_event:0}) // . queue1.go(testfun,[4]).then( function(data){console.log('done-succ:',data)}, function(err){console.log('done-err:',err)} ) queue1.go(testfun,[5],{ event_succ:function(data){console.log('conf-succ:',data)}, event_err:function(err){console.log('conf-err:',err)} })
内蔵Promise実現類についてqueuefun.QPromises/A+仕様および
done
、spread
、fail
を実現しました.API模倣Q;シミュレーションが実現されました q.defer
、q.Promise
、q.all
、q.any
、q.nfcall
、q.nfapply
等関数.toPromis(obj).then()
もしあなたがコードを書くのに慣れたら、普通の関数/語句をtoPromisで包装してみてください.彼にthenメソッドを獲得して、エラーを捕まえられます.
var add = function(a,b){return a+b;} q.toPromis(function(){return add(a+b)}) .then(console.log,console.error)
完全を期するgithub: https://github.com/cnwhy/queue-fun