es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Convirtiendo Parallel ForEach en PLINQ para procesar una lista de tareas

Estoy tratando de cargar la mayor cantidad de mensajes posible en un servidor lo más rápido posible. Actualmente tengo este fragmento de código y para cargar 50000 mensajes en un servidor de mensajería, lleva alrededor de 5 minutos. Esta es una lista de tareas que tienen el nombre del servidor, el nombre de la cola y el mensaje para colocar en la cola.

  taskList.Add(new Task(() => PlaceMessageOnQueue(server, queueName, message)));

Este es el código actual que tengo, pero quiero convertir esto a PLINQ con la esperanza de que sea aún más rápido.

_= Parallel.ForEach(task, new ParallelOptions()
{
MaxDegreeOfParallelism = Environment.ProcessorCount; //Tengo 4 núcleos
},t => {
 t.Start();
 t.Wait();
Console.WriteLine(t.Status)
});

Hasta ahora, esto no está iniciando las tareas. Este es el código a continuación en el que necesito ayuda.

var results = task.
.AsParallel()
.AsOrdered()
.WithDegreeofParallelism(Environment.ProcessorCount)
.ToList();
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para mejorar el rendimiento de carga de mensajes en un servidor, puedes utilizar PLINQ para paralelizar la ejecución de las tareas. Aquí tienes un ejemplo de cómo podrías modificar tu código:

    var opciones = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount };
    var resultados = listaDeTareas.AsParallel()
        .WithDegreeOfParallelism(Environment.ProcessorCount)
        .Select(t => {
            t.Start();
            t.Wait();
            return t.Status;
        })
        .ToList();
    

    En este ejemplo, creamos un objeto ParallelOptions para establecer el grado máximo de paralelismo como el número de núcleos del procesador en la máquina. Luego utilizamos el método de extensión AsParallel para crear una consulta paralela a partir de la lista de tareas. Especificamos el grado de paralelismo para que coincida con el número de núcleos del procesador establecido en ParallelOptions.

    Luego utilizamos el operador Select para recorrer cada tarea, iniciarla, esperar a que se complete y devolver su estado. Los resultados se recopilan en una lista utilizando el método ToList.

    Al utilizar PLINQ, la ejecución de las tareas se puede distribuir en varios núcleos del procesador, lo que debería mejorar la velocidad a la que se cargan los mensajes en el servidor. Sin embargo, ten en cuenta que los recursos del servidor y la latencia de la red aún pueden limitar el rendimiento general.

Comments are closed.