Redian新闻
>
Node.js里将blocking call转换成non blocking call的办法
avatar
s*w
2
从java往node转,原先有一段blocking call,
send request to 3rd party service, 这个service比较慢,
原先java是用glassfish, 搞1000个thread,
最糟糕的时候就是1000个同时往3rd party service送。
现在用node, 大家觉得怎么办好? 用settimeout() ?
node自己的async的readFile()怎么实现的?
我觉得自己对promise还没有理解透彻。
avatar
F*t
3
好松软,太棒了
avatar
j*w
4
我一直用 q,挺好用,不过那是基于 promise 的。
现在听说 bluebird 资源占用更少,可以试试看。
avatar
h*m
5
这不成心让人睡不着么~~~
口水都流满地啦~
上个方子呗~

【在 b**o 的大作中提到】
: 刚出炉的哟,我本来只要吃半个,结果忍不住吃掉一个,要去burn掉卡路里了。。。
: 真的很软,很香甜哦!
: 菜谱link:
: http://blog.gxsky.com/blog_view_540609.html

avatar
s*i
6
可以考虑 await Promise.all(...) 一行搞定
avatar
b*o
7
上了,上了。
在第一楼。新桐的方子,很久以前我也做过,用的一般的coconut flake,不好。要买
那种干的,很短的coconut。我在whole food店买的。
今天做了2个配方的量,椰子馅用了2TBSP butter,一个蛋,半杯糖,1杯半coconut。
一半用了糖分,另一半没有用,我洒的不多,尝起来没有区别,而且不用糖粉就够甜了。
家里面粉都快被我折腾完了,明天再不能出门就不好玩了。 :(

【在 h*****m 的大作中提到】
: 这不成心让人睡不着么~~~
: 口水都流满地啦~
: 上个方子呗~

avatar
s*w
8
大概我没说清楚,不是说要等1000个request 全部从3rd party service收到response,
而是node这里可以不间断地发出request.
如果直接copy existing java code, 那个是block call, node只能发一个,等3rd
party service处理结束了再发下一个。

【在 s*i 的大作中提到】
: 可以考虑 await Promise.all(...) 一行搞定
avatar
k*u
9
香死了。。。等我冰箱里的香肠包吃完我也要做这个!哈哈。。。快上方子!哈哈
avatar
c*n
10
看了好几遍还是没看懂你的问题描述
第三方慢 为啥还要发这么多去轰炸人家服务器?
还是说你这1000个是积累了很多request 因为对方慢?
最直接的应该是promise.then()或者await,尤其是后者 直接可以抄blocking的逻辑了
另外可以看一下bluebird这个lib来做promise 有几个比较有用的附加功能
1. 限流 限制同时发起多少个request
2. timeout
3. cancel

response,

【在 s*****w 的大作中提到】
: 大概我没说清楚,不是说要等1000个request 全部从3rd party service收到response,
: 而是node这里可以不间断地发出request.
: 如果直接copy existing java code, 那个是block call, node只能发一个,等3rd
: party service处理结束了再发下一个。

avatar
E*A
11
椰蓉太香了
avatar
s*w
12
抱歉,是现有的java程序就是这样,
create 1000 threads
foreach thread {
block_function(req);
}
要改成node, 开始没想通node作为single thread 怎么做。
我最后发现的解决方案是用setTimeout,
比如
setTimeout(block_function, 0)
从node这端就可以不停地发了。
主要是自己没有完全理解node,请各位大牛指教。

【在 c******n 的大作中提到】
: 看了好几遍还是没看懂你的问题描述
: 第三方慢 为啥还要发这么多去轰炸人家服务器?
: 还是说你这1000个是积累了很多request 因为对方慢?
: 最直接的应该是promise.then()或者await,尤其是后者 直接可以抄blocking的逻辑了
: 另外可以看一下bluebird这个lib来做promise 有几个比较有用的附加功能
: 1. 限流 限制同时发起多少个request
: 2. timeout
: 3. cancel
:
: response,

avatar
m*h
13
我小时候最爱吃这个了。
我心动了,做这个得买面包机吗?
avatar
c*n
14
setTimeOut算是上古时代的async了 主要是后续不怎么好控制
而且你这1k个request对方服务器没有api访问限制吗
const Promise = require("bluebird")
// 假设你用了callback 或者其他办法 保证你这个block function是async
const block_functionAsync = Promise.promisifyAll(block_function)
const thousandFetch = [...Array(1000)].map(() => block_functionAsync (req))
const result = await Promise.map(thousandFetch, {concurrency: 10
})
没开ide硬写的 可能有语法错误 表达下思路
不过 这样稍微可以控制一下流量 直接扔一堆过去 我以前跑死过对面的IIS和Spring,
估计都是没优化好 没限流 也没load balancer那种
ref:
http://bluebirdjs.com/docs/api/promise.map.html
我其实还是没理解 你发了1k个request之后 准备怎么搞 以及为啥要发这么多
setTimeOut方便发 但是不方便后续拿到结果的处理 所谓callbackhell
或者说因为你知道对方服务器速度慢 但是你想尽快拿到一部分结果? 可以试试下面2
个 尤其是后面那个 拿到一个response就自动停止了
http://bluebirdjs.com/docs/api/promise.some.html
http://bluebirdjs.com/docs/api/promise.any.html
还是说其实就是想敲1k下门?
edit1: 果然写错了 改下

【在 s*****w 的大作中提到】
: 抱歉,是现有的java程序就是这样,
: create 1000 threads
: foreach thread {
: block_function(req);
: }
: 要改成node, 开始没想通node作为single thread 怎么做。
: 我最后发现的解决方案是用setTimeout,
: 比如
: setTimeout(block_function, 0)
: 从node这端就可以不停地发了。

avatar
b*o
15
菜谱link:
http://blog.gxsky.com/blog_view_540609.html

【在 k******u 的大作中提到】
: 香死了。。。等我冰箱里的香肠包吃完我也要做这个!哈哈。。。快上方子!哈哈
avatar
s*i
16
我斗胆comment一下:
1. 楼主可能不知道Node里,request本身就是async的。
2. chunjuan,blocking的function在Node里是不可能变成async的。promisify只是把
一种写法换成另一种写法而已。把async的function变成blocking的倒是有可能。

【在 c******n 的大作中提到】
: setTimeOut算是上古时代的async了 主要是后续不怎么好控制
: 而且你这1k个request对方服务器没有api访问限制吗
: const Promise = require("bluebird")
: // 假设你用了callback 或者其他办法 保证你这个block function是async
: const block_functionAsync = Promise.promisifyAll(block_function)
: const thousandFetch = [...Array(1000)].map(() => block_functionAsync (req))
: const result = await Promise.map(thousandFetch, {concurrency: 10
: })
: 没开ide硬写的 可能有语法错误 表达下思路
: 不过 这样稍微可以控制一下流量 直接扔一堆过去 我以前跑死过对面的IIS和Spring,

avatar
b*o
17
手揉也成啊。我有stand mixer。

【在 m****h 的大作中提到】
: 我小时候最爱吃这个了。
: 我心动了,做这个得买面包机吗?

avatar
c*n
18
嗯 我写了之后 就想他要是能把async改成blocking的 难道不直接await就好了
所以后来加了个注释 假设他那个request起码已经写成callback形式

【在 s*i 的大作中提到】
: 我斗胆comment一下:
: 1. 楼主可能不知道Node里,request本身就是async的。
: 2. chunjuan,blocking的function在Node里是不可能变成async的。promisify只是把
: 一种写法换成另一种写法而已。把async的function变成blocking的倒是有可能。

avatar
x*n
19
好棒,求方子~
avatar
s*w
20
"blocking的function在Node里是不可能变成async的。"
blocking function 外面加一个settimeout变成async,看这个
https://medium.com/from-the-scratch/javascript-writing-your-own-non-blocking
-asynchronous-functions-60091ceacc79

【在 s*i 的大作中提到】
: 我斗胆comment一下:
: 1. 楼主可能不知道Node里,request本身就是async的。
: 2. chunjuan,blocking的function在Node里是不可能变成async的。promisify只是把
: 一种写法换成另一种写法而已。把async的function变成blocking的倒是有可能。

avatar
d*g
21
你是面包小超人~~~~
我也要做这个面包吃!!!

【在 k******u 的大作中提到】
: 香死了。。。等我冰箱里的香肠包吃完我也要做这个!哈哈。。。快上方子!哈哈
avatar
s*w
22
node service是中间人,
前端有用户不停地发request, 送给java service, 再送给第3方。第3方同时可以处理
1000个,每个处理完的发一个response给java。现在的问题是java用block call在等
response.
现在我想把java换成node。

【在 c******n 的大作中提到】
: setTimeOut算是上古时代的async了 主要是后续不怎么好控制
: 而且你这1k个request对方服务器没有api访问限制吗
: const Promise = require("bluebird")
: // 假设你用了callback 或者其他办法 保证你这个block function是async
: const block_functionAsync = Promise.promisifyAll(block_function)
: const thousandFetch = [...Array(1000)].map(() => block_functionAsync (req))
: const result = await Promise.map(thousandFetch, {concurrency: 10
: })
: 没开ide硬写的 可能有语法错误 表达下思路
: 不过 这样稍微可以控制一下流量 直接扔一堆过去 我以前跑死过对面的IIS和Spring,

avatar
b*o
23
有人反映说菜谱link不work,我copy 过来
来自私房小菜网友口水猪的原贴!
3 UPS ALL PURPOSE FLOUR、1/4 CUP 糖、1 TEASPOON 盐、2 TEASPOONS ACTIVE DRY
YEAST、1/2 CUP 水、1/2 CUP 牛奶、1/4 CUP BUTTER或者MARGARINE1 EGG
做法:
先把1CUP面粉和糖,盐,YEAST混合均匀.加热水,牛奶和BUTTER到 120-130(F).鸡蛋略
打散.该溶液和鸡蛋都倒入面粉混合物,先用手拌拌匀,然后中速搅拌3分钟.加入剩下的
面粉,手揉或者搅拌8-10分钟,直到面团非常有弹性.
初次发酵1个小时(到面团成两倍),击打面团,手指叉入面团,释放其中的起跑.然后割
块儿,整行成自己想要的形状,在烤盘上放好,再发酵45-60分钟.
350F,烤15-20分钟,或者表面金棕色.
用该面团可以做出很多种不同的甜面包,任您发挥.
椰蓉面包:面团杆成长方形,刷上牛油溶液,撒上多多的椰容,卷起来,切成段儿,搞定.
SORRY, 忘了一点,用一个蛋加上一TABLESPOON水打匀,刷在即将入烤箱的面包胚上...
avatar
s*i
24
postpone exexution != async 。那篇文章明显不懂


: "blocking的function在Node里是不可能变成async的。"

: blocking function 外面加一个settimeout变成async,看这个

: https://medium.com/from-the-scratch/javascript-writing-your-own-non-
blocking

: -asynchronous-functions-60091ceacc79



【在 s*****w 的大作中提到】
: node service是中间人,
: 前端有用户不停地发request, 送给java service, 再送给第3方。第3方同时可以处理
: 1000个,每个处理完的发一个response给java。现在的问题是java用block call在等
: response.
: 现在我想把java换成node。

avatar
s*i
25
avatar
s*w
26
不理解了,用那个settimout不就是为了让后面的request都有机会发出去吗?
第3方的回复会比较慢,java就用多线程最多同时处理1000个,
那你说我用node怎么办? 我不可能像java一样发一个等一个。

【在 s*i 的大作中提到】
: postpone exexution != async 。那篇文章明显不懂
:
:
: "blocking的function在Node里是不可能变成async的。"
:
: blocking function 外面加一个settimeout变成async,看这个
:
: https://medium.com/from-the-scratch/javascript-writing-your-own-non-
: blocking
:
: -asynchronous-functions-60091ceacc79
:

avatar
a*l
27
靓!
avatar
s*i
28
用Java的思维方式来理解JS不会好。Node里,
...
request(url1, callback)
request(url2, csllback)
...
这两个是并行关系。就是同时并行发送2个请求出去。
如果同时并行发送1000个请求出去,并且想得到所有都结束后的结果,用Promise.all(
...)


: 不理解了,用那个settimout不就是为了让后面的request都有机会发出去吗?

: 第3方的回复会比较慢,java就用多线程最多同时处理1000个,

: 那你说我用node怎么办? 我不可能像java一样发一个等一个。



【在 s*****w 的大作中提到】
: 不理解了,用那个settimout不就是为了让后面的request都有机会发出去吗?
: 第3方的回复会比较慢,java就用多线程最多同时处理1000个,
: 那你说我用node怎么办? 我不可能像java一样发一个等一个。

avatar
b*o
29
你也是个夜猫子呀。hehe
玩具怎么收啊?头疼ing...

【在 a****l 的大作中提到】
: 靓!
avatar
c*n
30
大致看懂了
你这个用最常见的js处理async的就可以了
js本身是non blocking的
无论是去post/get拿数据 本地读i/o 如果你直接写’我要去拿数据‘ 代码都是执行完
了一路向下走不管数据拿得怎么样的
比如
const abc = fetch('http://www.mitbbs.com')
console.log(abc)
控制台只会告诉你abc是个promise,数据啥都没 因为还没等拿到 代码已经执行到下面
那行了
而你那个setTimeOut只能群发 后面的没法控制
上面fetch()本身返回的是promise,算是加了糖的callback function
而callback function的作用就是等那边完成任务来叫告诉你 这边搞定了 顺便把数值
传给你 现在有数据 你该干嘛干嘛
所以你第一步先得把你和第三方通信的方式写成带callback的 如果只是普通的request
的话那现成轮子太多了 如果要读console那还得写readline
有了带callback的request,你再去瞄一眼async/await 你就可以按照你之前block的写
法写了
但是不用攒了1k个才发,有一个发一个 反正js手头的这个发掉就直接发下一个了 直到
对面callback了才接手一下
所以1k个真是很快就发出去了 你估计还得手动写个counter 控制下流量 别把第三方弄
崩了或者被封了ip/api key

【在 s*****w 的大作中提到】
: node service是中间人,
: 前端有用户不停地发request, 送给java service, 再送给第3方。第3方同时可以处理
: 1000个,每个处理完的发一个response给java。现在的问题是java用block call在等
: response.
: 现在我想把java换成node。

avatar
k*u
31
帮你把菜谱贴到一楼了。。。哈哈~~~
avatar
s*w
32
我看了下request, 你是对的,它可以用callback。
最主要是我忘了这是一个http request, 就只想着block call.
等等我去把java code换换看。
多谢!

all(

【在 s*i 的大作中提到】
: 用Java的思维方式来理解JS不会好。Node里,
: ...
: request(url1, callback)
: request(url2, csllback)
: ...
: 这两个是并行关系。就是同时并行发送2个请求出去。
: 如果同时并行发送1000个请求出去,并且想得到所有都结束后的结果,用Promise.all(
: ...)
:
:
: 不理解了,用那个settimout不就是为了让后面的request都有机会发出去吗?

avatar
b*o
33
good job!

【在 k******u 的大作中提到】
: 帮你把菜谱贴到一楼了。。。哈哈~~~
avatar
y*3
34
介个太喜欢了,香香甜甜
avatar
p*e
35
每次看MM贴糕点又唠叨要去burn calorie就忍不住笑

【在 b**o 的大作中提到】
: 刚出炉的哟,我本来只要吃半个,结果忍不住吃掉一个,要去burn掉卡路里了。。。
: 真的很软,很香甜哦!
: 菜谱link:
: http://blog.gxsky.com/blog_view_540609.html

avatar
s*0
36
厉害啊。同学们都是全职做吃的吗?
avatar
l*3
37
大赞美女。。。
avatar
b*o
38
没有办法呀,减肥大业尚未成功呢。

【在 p*****e 的大作中提到】
: 每次看MM贴糕点又唠叨要去burn calorie就忍不住笑
avatar
b*o
39
没有啦,这几天被困在家里。消遣用的。

【在 s********0 的大作中提到】
: 厉害啊。同学们都是全职做吃的吗?
avatar
l*t
40
Like 椰茸
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。