当前在线人数11890
首页 - 分类讨论区 - 电脑网络 - 葵花宝典版 - 同主题阅读文章

此篇文章共收到打赏
0

  • 10
  • 20
  • 50
  • 100
您目前伪币余额:0
未名交友
[更多]
[更多]
Node.js里将blocking call转换成non blocking call的办法
[版面:葵花宝典][首篇作者:somehow] , 2019年04月20日19:45:53 ,398次阅读,16次回复
来APP回复,赚取更多伪币 关注本站公众号:
[分页:1 ]
somehow
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 1 ]

发信人: somehow (修身健体), 信区: Programming
标  题: Node.js里将blocking call转换成non blocking call的办法
发信站: BBS 未名空间站 (Sat Apr 20 19:45:53 2019, 美东)

从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还没有理解透彻。




--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 108.]

 
justnow
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 2 ]

发信人: justnow (阿材), 信区: Programming
标  题: Re: Node.js里将blocking call转换成non blocking call的办法
发信站: BBS 未名空间站 (Sun Apr 21 09:55:54 2019, 美东)

我一直用 q,挺好用,不过那是基于 promise 的。

现在听说 bluebird 资源占用更少,可以试试看。
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 47.]

 
sui
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 3 ]

发信人: sui (黑圈圈), 信区: Programming
标  题: Node.js里将blocking call转换成non blocking call的
发信站: BBS 未名空间站 (Sun Apr 21 09:57:00 2019, 美东)

可以考虑 await Promise.all(...) 一行搞定

--
※ 来源:· 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 71.]

 
somehow
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 4 ]

发信人: somehow (修身健体), 信区: Programming
标  题: Re: Node.js里将blocking call转换成non blocking call的�
发信站: BBS 未名空间站 (Sun Apr 21 11:53:23 2019, 美东)

大概我没说清楚,不是说要等1000个request 全部从3rd party service收到response,
而是node这里可以不间断地发出request.

如果直接copy existing java code, 那个是block call, node只能发一个,等3rd
party service处理结束了再发下一个。

【 在 sui (黑圈圈) 的大作中提到: 】
: 可以考虑 await Promise.all(...) 一行搞定



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 108.]

 
chunjuan
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 5 ]

发信人: chunjuan (👍春卷🐱更多春卷👍), 信区: Programming
标  题: Re: Node.js里将blocking call转换成non blocking call的ʏ
发信站: BBS 未名空间站 (Sun Apr 21 22:40:28 2019, 美东)

看了好几遍还是没看懂你的问题描述
第三方慢 为啥还要发这么多去轰炸人家服务器?
还是说你这1000个是积累了很多request 因为对方慢?

最直接的应该是promise.then()或者await,尤其是后者 直接可以抄blocking的逻辑了
另外可以看一下bluebird这个lib来做promise 有几个比较有用的附加功能
1. 限流 限制同时发起多少个request
2. timeout
3. cancel

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



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:2c3:400:9d]

 
somehow
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 6 ]

发信人: somehow (修身健体), 信区: Programming
标  题: Re: Node.js里将blocking call转换成non blocking call的ʏ
发信站: BBS 未名空间站 (Mon Apr 22 20:07:16 2019, 美东)

抱歉,是现有的java程序就是这样,
create 1000 threads
foreach thread {
    block_function(req);
}

要改成node, 开始没想通node作为single thread 怎么做。

我最后发现的解决方案是用setTimeout,
比如
setTimeout(block_function, 0)
从node这端就可以不停地发了。

主要是自己没有完全理解node,请各位大牛指教。


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



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 108.]

 
chunjuan
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 7 ]

发信人: chunjuan (👍春卷🐱更多春卷👍), 信区: Programming
标  题: Re: Node.js里将blocking call转换成non blocking call的ʏ
发信站: BBS 未名空间站 (Tue Apr 23 10:37:05 2019, 美东)

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: 果然写错了 改下
【 在 somehow (修身健体) 的大作中提到: 】
: 抱歉,是现有的java程序就是这样,
: create 1000 threads
: foreach thread {
:     block_function(req);
: }
: 要改成node, 开始没想通node作为single thread 怎么做。
: 我最后发现的解决方案是用setTimeout,
: 比如
: setTimeout(block_function, 0)
: 从node这端就可以不停地发了。
: ...................







--
※ 修改:·chunjuan 於 Apr 23 10:52:15 2019 修改本文·[FROM: 192.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 192.]

 
sui
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 8 ]

发信人: sui (黑圈圈), 信区: Programming
标  题: Re: Node.js里将blocking call转换成non blocking call的ʏ
发信站: BBS 未名空间站 (Tue Apr 23 13:56:27 2019, 美东)

我斗胆comment一下:
1. 楼主可能不知道Node里,request本身就是async的。
2.  chunjuan,blocking的function在Node里是不可能变成async的。promisify只是把
一种写法换成另一种写法而已。把async的function变成blocking的倒是有可能。
【 在 chunjuan (👍春卷🐱更多春卷👍) 的大作中提到: 】
: 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,
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 12.]

 
chunjuan
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 9 ]

发信人: chunjuan (👍春卷🐱更多春卷👍), 信区: Programming
标  题: Re: Node.js里将blocking call转换成non blocking call的ʏ
发信站: BBS 未名空间站 (Tue Apr 23 15:14:30 2019, 美东)

嗯 我写了之后 就想他要是能把async改成blocking的 难道不直接await就好了

所以后来加了个注释 假设他那个request起码已经写成callback形式
【 在 sui (黑圈圈) 的大作中提到: 】
: 我斗胆comment一下:
: 1. 楼主可能不知道Node里,request本身就是async的。
: 2.  chunjuan,blocking的function在Node里是不可能变成async的。promisify只是把
: 一种写法换成另一种写法而已。把async的function变成blocking的倒是有可能。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 192.]

 
somehow
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 10 ]

发信人: somehow (修身健体), 信区: Programming
标  题: Re: Node.js里将blocking call转换成non blocking call的ʏ
发信站: BBS 未名空间站 (Tue Apr 23 20:07:15 2019, 美东)

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


blocking function 外面加一个settimeout变成async,看这个
https://medium.com/from-the-scratch/javascript-writing-your-own-non-blocking
-asynchronous-functions-60091ceacc79


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



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 108.]

 
somehow
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 11 ]

发信人: somehow (修身健体), 信区: Programming
标  题: Re: Node.js里将blocking call转换成non blocking call的ʏ
发信站: BBS 未名空间站 (Tue Apr 23 20:12:19 2019, 美东)

node service是中间人,

前端有用户不停地发request, 送给java service, 再送给第3方。第3方同时可以处理
1000个,每个处理完的发一个response给java。现在的问题是java用block call在等
response.
现在我想把java换成node。


【 在 chunjuan (👍春卷🐱更多春卷👍) 的大作中提到: 】
: 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,
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 108.]

 
sui
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 12 ]

发信人: sui (黑圈圈), 信区: Programming
标  题: Re: Node.js閲屽皢blocking call杞崲鎴恘on blockin
发信站: BBS 未名空间站 (Tue Apr 23 21:17:46 2019, 美东)

postpone exexution != async 。那篇文章明显不懂


【 在 somehow(修身健体) 的大作中提到: 】
<br>: "blocking的function在Node里是不可能变成async的。"
<br>: blocking function 外面加一个settimeout变成async,看这个
<br>: https://medium.com/from-the-scratch/javascript-writing-your-own-non-
blocking
<br>: -asynchronous-functions-60091ceacc79
<br>
--
※ 来源:· 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 71.]

 
somehow
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 13 ]

发信人: somehow (修身健体), 信区: Programming
标  题: Re: Node.js閲屽皢blocking call杞崲鎴恘on blockin
发信站: BBS 未名空间站 (Tue Apr 23 21:35:49 2019, 美东)

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

第3方的回复会比较慢,java就用多线程最多同时处理1000个,
那你说我用node怎么办? 我不可能像java一样发一个等一个。

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




--
※ 修改:·somehow 於 Apr 23 21:36:33 2019 修改本文·[FROM: 108.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 108.]

 
sui
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 14 ]

发信人: sui (黑圈圈), 信区: Programming
标  题: Re: Node.js里将blocking call转换成non blockin
发信站: BBS 未名空间站 (Tue Apr 23 21:52:55 2019, 美东)

用Java的思维方式来理解JS不会好。Node里,
...
request(url1, callback)
request(url2, csllback)
...

这两个是并行关系。就是同时并行发送2个请求出去。
如果同时并行发送1000个请求出去,并且想得到所有都结束后的结果,用Promise.all(
...)



【 在 somehow(修身健体) 的大作中提到: 】
<br>: 不理解了,用那个settimout不就是为了让后面的request都有机会发出去吗?
<br>: 第3方的回复会比较慢,java就用多线程最多同时处理1000个,
<br>: 那你说我用node怎么办? 我不可能像java一样发一个等一个。
<br>
--
※ 来源:· 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 71.]

 
chunjuan
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 15 ]

发信人: chunjuan (👍春卷🐱更多春卷👍), 信区: Programming
标  题: Re: Node.js里将blocking call转换成non blocking call的ʏ
发信站: BBS 未名空间站 (Tue Apr 23 22:06:19 2019, 美东)

大致看懂了
你这个用最常见的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

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



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 98.]

 
somehow
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 16 ]

发信人: somehow (修身健体), 信区: Programming
标  题: Re: Node.js里将blocking call转换成non blockin
发信站: BBS 未名空间站 (Tue Apr 23 22:07:00 2019, 美东)

我看了下request, 你是对的,它可以用callback。
最主要是我忘了这是一个http request, 就只想着block call.
等等我去把java code换换看。
多谢!

【 在 sui (黑圈圈) 的大作中提到: 】
: 用Java的思维方式来理解JS不会好。Node里,
: ...
: request(url1, callback)
: request(url2, csllback)
: ...
: 这两个是并行关系。就是同时并行发送2个请求出去。
: 如果同时并行发送1000个请求出去,并且想得到所有都结束后的结果,用Promise.
all(
: ...)
: <br>: 不理解了,用那个settimout不就是为了让后面的request都有机会发出去吗?
: <br>: 第3方的回复会比较慢,java就用多线程最多同时处理1000个,
: ...................




--
※ 修改:·somehow 於 Apr 23 22:38:44 2019 修改本文·[FROM: 108.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 108.]

[分页:1 ]
[快速返回] [ 进入葵花宝典讨论区] [返回顶部]
回复文章
标题:
内 容:

未名交友
将您的链接放在这儿

友情链接


 

Site Map - Contact Us - Terms and Conditions - Privacy Policy

版权所有,未名空间(mitbbs.com),since 1996