概要
POSTで受信したデータを元に処理を実行するコードを書いています。送信元からの要件で5秒以内に応答が必要な為、処理に時間がかかるコードを非同期に実行して、先に送信元へ応答を済ませたいと考えています。
コード
export const handler=async(event:any, context:Context, callback:Callback)=>{ const order = JSON.parse(event.body) // 処理に時間のかかるコード await heavyMetod(order) callback(null, { statusCode: 200, headers: {'Access-Control-Allow-Origin':'*'}, body:'Done' }) } // puppeteerを使用するため実行時間が10秒ほど掛かってしまいます。 // この部分を非同期にバックグラウンドで実行したいと考えております。 const heavyMetod = async(data) =>{ const browser = await chromium.puppeteer.launch({ args: chromium.args, defaultViewport: chromium.defaultViewport, executablePath: await chromium.executablePath, headless: chromium.headless, }) let page = await browser.newPage(); await page.goto(data.url); const elem = await page.$x("//input[@name='auth']") if(Array.isArray(elem)){ await Promise.all([ elem[0].click(), page.waitForNavigation() ]) console.log(await page.title()) }else{ await Promise.all([ elem.click(), page.waitForNavigation() ]) console.log(await page.title()) } await browser.close() }
試したこと
処理に時間のかかる関数(heavyMetod)を呼び出す際、await heavyMetod(order)部分をheavyMetod(order)に書き換えて実行してみましたが、同期して呼び出されており全体の実行時間は減りませんでした。
このheavyMetod自体はPromiseを返すのでローカル環境で実行した際は<pending>なります。
しかし、ライブ環境(Lambda)では全体の実行時間が減らない事から同期的に実行されていると思います。
質問
- 上記のheavyMetodは非同期に実行出来ない理由についてご指摘頂けないでしょうか?
- Lambda上では非同期関数も同期的に実行される事はありえますか?
宜しくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。