¿Puedo preguntar cómo realizar múltiples subprocesos en algunas funciones en dardo? por ejemplo, tengo 16 funciones futuras primero quiero ejecutar esta función en el primer hilo

await GetRoot(); //Future<void>

Luego después del final del primer hilo quiero ejecutar estas funciones en el segundo hilo - juntos al mismo tiempo -

 await GetLocalRadio();//Future<void>
  await GetMusic();//Future<void>
  await GetTalk();//Future<void>
  await GetSports();//Future<void>
  await GetByLocation();//Future<void>
  await GetByLanguage();//Future<void>
  await GetPodcasts();//Future<void>

Luego, una vez finalizado el segundo hilo , quiero ejecutar estos hilos juntos al mismo tiempo en el siguiente hilo

 await GetPodcasts2();//Future<void>
  await GetByLocation2();//Future<void>

Luego cuando finalice el segundo hilo quiero que cuando finalice la tercera función ejecutar estas funciones juntas al mismo tiempo en un hilo nuevo

  await FillPdcasts();//Future<void>
  await FillLocalRadio();//Future<void>
  await FillMusic();//Future<void>
  await FillTalk();//Future<void>
  await FillSports();//Future<void>
  await FillByLocation();//Future<void>

Aquí hay un simple del contenido de todos los métodos que tengo

 Future<void> FillByLocation()
  async {
    for (var entry in xByLocation2) {
        final responseFinalByLocation2 = await http.Client().get(entry.split('^')[1], headers: {'Content-Type': 'application/json; charset=utf-8'});
        try{
          final FinalByLocation2final = allInfosFromJson(utf8.decode(responseFinalByLocation2.bodyBytes));
          for (int i = 0; i < FinalByLocation2final.body.length; i++) {
            for (int j = 0; j < FinalByLocation2final.body[i].children.length; j++) {
              if(FinalByLocation2final.body[i].children[j].text != null && FinalByLocation2final.body[i].children[j].image != null)
              {
                if(!xListFinalAllInfos.contains(FinalByLocation2final.body[i].children[j].text + "^" + FinalByLocation2final.body[i].children[j].subtext + "^" + FinalByLocation2final.body[i].children[j].nowPlayingId + "^" + FinalByLocation2final.body[i].children[j].currentTrack+ "^" + FinalByLocation2final.body[i].children[j].url+ "^" + FinalByLocation2final.body[i].children[j].image))
                  {
                    setState(() {
                      xListFinalAllInfos.add(FinalByLocation2final.body[i].children[j].text + "^" + FinalByLocation2final.body[i].children[j].subtext + "^" + FinalByLocation2final.body[i].children[j].nowPlayingId + "^" + FinalByLocation2final.body[i].children[j].currentTrack+ "^" + FinalByLocation2final.body[i].children[j].url+ "^" + FinalByLocation2final.body[i].children[j].image);
                      // ListFinalAllInfos.putIfAbsent(
                      //     FinalByLocation2final.body[i].children[j].text, () =>
                      // FinalByLocation2final.body[i].children[j].image );
                    });
                  }
              }
            }
          }
        }catch(e){}
      }
  }

Porque cuando ejecuto todas las funciones y las espero todas, esto me llevará unos 30 segundos. Esto es mucho tiempo, así que necesito que el tiempo sea inferior a 30 segundos.

-2
test firma 23 oct. 2020 a las 14:41

1 respuesta

La mejor respuesta

El multihilo no es una opción aquí. Solo mantén la asincronía.

Todos tus await s hacen que tu código sea mucho más lento. Estás forzando la finalización de la función anterior antes de que la siguiente función pueda incluso comenzar. Llámalos a todos al mismo tiempo y usa Future.wait.

await GetRoot();

List<Future<void>> toWait = [];
toWait.add(GetLocalRadio());
toWait.add(GetMusic());
...

await Future.wait(toWait);
toWait.clear();

toWait.add(GetPodcasts2());
toWait.add(GetByLocation2());

await Future.wait(toWait);
toWait.clear();

toWait.add(FillPdcasts());
toWait.add(FillLocalRadio());
...

await Future.wait(toWait);
toWait.clear();

Además, el trabajo que está haciendo dentro de estas funciones también se implementa de manera ineficiente. Está esperando a que finalice cada llamada http antes de procesar los datos de la llamada y comenzar la siguiente. Esto se puede hacer más eficiente.

El siguiente código usa .then para registrar devoluciones de llamada para cada una de las llamadas de red, almacena los futuros en una lista y usa Future.wait al final para asegurarse de que estén todos completados antes de que regrese la función contenedora.

 Future<void> FillByLocation()
  async {
    List<Future<void>> toWait = [];
    for (var entry in xByLocation2) {
        toWait.add(http.Client().get(entry.split('^')[1], headers: {'Content-Type': 'application/json; charset=utf-8'}).then((responseFinalByLocation2){
        try{
          final FinalByLocation2final = allInfosFromJson(utf8.decode(responseFinalByLocation2.bodyBytes));
          for (int i = 0; i < FinalByLocation2final.body.length; i++) {
            for (int j = 0; j < FinalByLocation2final.body[i].children.length; j++) {
              if(FinalByLocation2final.body[i].children[j].text != null && FinalByLocation2final.body[i].children[j].image != null)
              {
                if(!xListFinalAllInfos.contains(FinalByLocation2final.body[i].children[j].text + "^" + FinalByLocation2final.body[i].children[j].subtext + "^" + FinalByLocation2final.body[i].children[j].nowPlayingId + "^" + FinalByLocation2final.body[i].children[j].currentTrack+ "^" + FinalByLocation2final.body[i].children[j].url+ "^" + FinalByLocation2final.body[i].children[j].image))
                  {
                    setState(() {
                      xListFinalAllInfos.add(FinalByLocation2final.body[i].children[j].text + "^" + FinalByLocation2final.body[i].children[j].subtext + "^" + FinalByLocation2final.body[i].children[j].nowPlayingId + "^" + FinalByLocation2final.body[i].children[j].currentTrack+ "^" + FinalByLocation2final.body[i].children[j].url+ "^" + FinalByLocation2final.body[i].children[j].image);
                      // ListFinalAllInfos.putIfAbsent(
                      //     FinalByLocation2final.body[i].children[j].text, () =>
                      // FinalByLocation2final.body[i].children[j].image );
                    });
                  }
              }
            }
          }
        }catch(e){}
        }));
      }
    await Future.wait(toWait);
  }
0
Christopher Moore 23 oct. 2020 a las 13:32