Estoy trabajando en una aplicación node.js que, una vez por semana, realizará una serie de solicitudes de obtención de API y almacenará el JSON devuelto en archivos.
Actualmente, el código itera en un bucle for, usando cada cadena en una matriz como parámetro para la solicitud. Para cada parámetro, solicitará, esperará el JSON devuelto, escribirá el JSON en un archivo y luego pasará al siguiente.
Esto lleva tiempo, y aunque esto solo se ejecuta una vez a la semana, estoy interesado en cualquier forma en que pueda acelerarlo. ¿Hay alguna forma en que pueda realizar simultáneamente solicitudes de búsqueda, pero seguir escribiendo en archivos individuales? Cuando intenté esto anteriormente, los archivos se crean pero no se escriben.
Suponiendo que escribe cada llamada a la API en un archivo separado, esto se puede construir de manera asíncrona. Si eso termina acelerando el rendimiento o no, depende de cuánto termine saturando las diversas transmisiones de IO.
Aquí está el pseudocódigo para demostrar. He hecho esto un poco más declarativo de lo que debe ser... es decir, podría ser más elegante que esto, pero para mostrar el patrón general:
async function callToAPI(uri) { // have your api call logic here, resolve to desirable response. } async function writeToDisk(body) { // have your disk writing logic here. } function doAllMyWork() { var api1 = callToAPI(someAPIurl1); var api2 = callToAPI(someAPIurl2); var res1, res2; [ res1, res 2] = await Promise.all([ api1, api2 ]); var dsk1 = writeToDisk(res1); var dsk2 = writeToDisk(res2); var dskRes1, dskRes2; [ dskRes1, dskRes2 ] = await Promise.all([ dsk1, dsk2 ]); console.log(dskRes1); console.log(dskRes2); }¿Qué tiene de malo este modelo simplista? Bueno, espere todas sus llamadas de API antes de comenzar sus llamadas de disco. Puede soltar el flujo de api->disk en una sola promesa y paralelizar esas promesas, como una simplificación, y agregaría otra muesca de aumento de rendimiento, especialmente si algunas llamadas api son más largas, más lentas o tienen cargas útiles significativamente más grandes que otras.
Aún así, su rendimiento general estará limitado por (A) la saturación de io y (B) el tiempo que lleva que ocurra la operación más larga.