typescript の async/await で直列 vs 並列
typescript でちょっとやってみました。
http://httpbin.org/delay/{delay}
というのは delay 秒待ってからレスポンス返してくれる URL です。
/* * serial vs parallel */ import request from 'request-promise-native'; function createUrl(sec: number): string { const secStr: string = String(sec); return `http://httpbin.org/delay/${secStr}`; } async function serial(urls: string[]): Promise<string[]> { let results = []; for (const url of urls) { const ret = await request(url); results.push(ret); } return results; } async function parallel(urls: string[]): Promise<string[]> { const promises = []; for (const url of urls) { const promise = request(url); promises.push(promise); } const results = await Promise.all(promises); return results; } async function main() { const range = [1, 2, 3, 4]; const urls = range.map(createUrl); let startTime = Date.now(); let results = await serial(urls); console.log('serial'); // 1 + 2 + 3 + 4 = 10 秒かかる console.log((Date.now() - startTime) / 1000); startTime = Date.now(); results = await parallel(urls); console.log('parallel'); // max(1, 2, 3, 4) = 4 秒かかる console.log((Date.now() - startTime) / 1000); } main();
動かしてみる。
$ mkdir test; cd $_ $ pbpaste > index.ts $ npm init -y $ npm i -S typescript @types/node $ npm i -S request @types/request $ npm i -S request-promise-native @types/request-promise-native $ npx tsc --init $ vim .tsconfig # target を es2017 に $ npx tsc $ node -v v8.4.0 $ node ./index.js serial 11.58 parallel 4.373
ちゃんと並列で動いてますね。