S*******s 发帖数: 13043 | 1 就是一共需要1百万个操作,先扔出1千个异步,等它们都执行完,再扔1千个,再等,
直到这1百万个全弄完。怎么实现?es7里有了await可能会方便点,可是我们现在还只
能用es6的promise。
相关的背景:典型的mysql访问是这样的:
var defered=Q.defer();
connection.query(sql,defered.makeNodeResolver());
return defered.promise;
那么我如果有1M条记录,对每个记录都需要访问数据库跑十几条操作,如果写成这样:
function ProcessAll(results ) {
var waitfor=[];
for( var i=0;i< results.length;i++){
waitfor.push( process(results[i]));
}
Q.all(waitfor).then(function(results) {
notifySuc(results);
},function(results){
notifyFail(results);
});
}
因为数据库操作是异步的,就会一下子产生一百万的数据库访问,经常把系统弄得内存
溢出。怎么能让这个操作一小批一小批地进行?这个promise的then我还玩不转啊。 |
p**r 发帖数: 5853 | 2 你内存溢出是你results造成的,
你取results的时候处理多少取多少。 |
c******n 发帖数: 16666 | 3 你说内存溢出是数据库的还是本地的?服务器的话几百万个应该没问题
那就是本机溢出了?
本地的话 你“1百万个全部弄完” 你是都存在内存里?每个promise好了之后then 写
到filestream里 最后弄完 到all了再来处理不行?
如果只是要flow control的话 你把那个waitfor改成1k 然后来几次直到百万应该就可
以了吧
注意(没看过q 不过应该都一样)promise all这块 只要有一个子promise reject,全
部都会reject掉。
所以要是猛糙快的话 可以自己把数据库请求这块封装到自己新建的new Promise,然后
即便数据库请求被reject了,你也resolve个错误代码啥的 最后一并处理掉
【在 S*******s 的大作中提到】 : 就是一共需要1百万个操作,先扔出1千个异步,等它们都执行完,再扔1千个,再等, : 直到这1百万个全弄完。怎么实现?es7里有了await可能会方便点,可是我们现在还只 : 能用es6的promise。 : 相关的背景:典型的mysql访问是这样的: : var defered=Q.defer(); : connection.query(sql,defered.makeNodeResolver()); : return defered.promise; : 那么我如果有1M条记录,对每个记录都需要访问数据库跑十几条操作,如果写成这样: : function ProcessAll(results ) { : var waitfor=[];
|
s*********y 发帖数: 6151 | 4 es6 generator is there to solve you problem
【在 S*******s 的大作中提到】 : 就是一共需要1百万个操作,先扔出1千个异步,等它们都执行完,再扔1千个,再等, : 直到这1百万个全弄完。怎么实现?es7里有了await可能会方便点,可是我们现在还只 : 能用es6的promise。 : 相关的背景:典型的mysql访问是这样的: : var defered=Q.defer(); : connection.query(sql,defered.makeNodeResolver()); : return defered.promise; : 那么我如果有1M条记录,对每个记录都需要访问数据库跑十几条操作,如果写成这样: : function ProcessAll(results ) { : var waitfor=[];
|
s*********y 发帖数: 6151 | 5 d内存溢出的问题另说。 我们用 async-q自己写了个batch processing 每次处理一个
batch 大概几千个request 过几秒再处理。 方法不止一种
【在 s*********y 的大作中提到】 : es6 generator is there to solve you problem
|