Cómo establecer el número máximo de hilos paralelos

This article was translated from English: Does it need improvement?
Translated
View the article in English

Cuando se leen grandes volúmenes de códigos de barras, confiar en un proceso de un solo hilo puede crear cuellos de botella en el rendimiento y limitar la escalabilidad. Sin embargo, el uso de subprocesos paralelos permite a su aplicación procesar varias imágenes simultáneamente, multiplicando eficazmente la potencia de procesamiento total y reduciendo drásticamente el tiempo que se tarda en finalizar un trabajo por lotes.

Establecer un límite máximo en estos hilos es una forma eficaz de optimizar el rendimiento. Garantiza que la aplicación utilice todo el potencial del hardware equilibrando la carga de trabajo entre los núcleos del procesador. Este enfoque maximiza la eficiencia, manteniendo el buen funcionamiento de la aplicación y ofreciendo los resultados más rápidos posibles.

IronBarcode proporciona una forma sencilla de controlar este límite, garantizando un rendimiento óptimo de la máquina. En la siguiente sección se muestra cómo establecer fácilmente estos límites de hilos.



Configurar el número máximo de hilos paralelos

Para este ejemplo, utilizaremos un gran conjunto de imágenes de códigos de barras para ilustrar la escalabilidad y la eficiencia de utilizar un proceso multihilo en lugar de uno monohilo. Puede descargar la carpeta de imágenes aquí.

Para configurar IronBarcode para que utilice más de un subproceso, primero se instancia un nuevo objeto BarcodeReaderOptions con Multithreaded establecido en true. A continuación, se establece la propiedad MaxParallelThreads asignando un valor entero. Por defecto, MaxParallelThreads está establecido en 4.

Tras configurar los ajustes, se importa un gran número de imágenes de códigos de barras de la carpeta. A continuación, mediante un bucle, se lee el directorio de imágenes de códigos de barras utilizando el método Read, pasando la ruta del archivo y las BarcodeReaderOptions configuradas. Por último, el valor y el tipo del código de barras se muestran accediendo al BarcodeResults.

:path=/static-assets/barcode/content-code-examples/how-to/set-max-parallel-thread.cs
using IronBarCode;
using System;
using System.IO;

int maxParallelThreads = 4;


var optionsFaster = new BarcodeReaderOptions
{
    // Set Max threads to 4
    Multithreaded = true,
    MaxParallelThreads = maxParallelThreads,
};

// Dynamically get the "images" folder in the current directory
string folderPath = Path.Combine(Directory.GetCurrentDirectory(), "images");

// Retrieve all JPG files in the directory
var pdfFiles = Directory.GetFiles(folderPath, "*.jpg");

foreach (var file in pdfFiles)
{
    // Read the barcode
    var results = BarcodeReader.Read(file);

    foreach (var result in results)
    {
        // Show the type and value for every barcode found
        Console.WriteLine($"Value: {result.Value}, Type: {result.BarcodeType}");
            
    }
    
}

Imports IronBarCode
Imports System
Imports System.IO

Dim maxParallelThreads As Integer = 4

Dim optionsFaster As New BarcodeReaderOptions With {
    .Multithreaded = True,
    .MaxParallelThreads = maxParallelThreads
}

' Dynamically get the "images" folder in the current directory
Dim folderPath As String = Path.Combine(Directory.GetCurrentDirectory(), "images")

' Retrieve all JPG files in the directory
Dim pdfFiles = Directory.GetFiles(folderPath, "*.jpg")

For Each file In pdfFiles
    ' Read the barcode
    Dim results = BarcodeReader.Read(file)

    For Each result In results
        ' Show the type and value for every barcode found
        Console.WriteLine($"Value: {result.Value}, Type: {result.BarcodeType}")
    Next
Next
$vbLabelText   $csharpLabel

Resultado

Salida multihilo

Como se muestra en la salida de la consola, muestra el valor y el tipo de código de barras para cada imagen correspondiente.

Configuración del máximo apropiado de hilos paralelos

Cuando la propiedad Multithreaded se establece en true, la propiedad MaxParallelThreads se establece por defecto en 4. Aunque no existe un límite estricto para el número entero asignado a MaxParallelThreads, establecer un valor superior a la capacidad del núcleo lógico de su hardware puede resultar en una disminución del rendimiento. Esto se debe a que el procesador no puede gestionar un cambio de contexto excesivo, lo que puede generar sobrecarga en lugar de velocidad. Como tal, el valor correcto de MaxParallelThreads depende de las especificaciones del ordenador, y los desarrolladores deben hacer pruebas para encontrar el valor óptimo para su entorno.

En este ejemplo, mostraremos el mismo escenario multihilo anterior, pero con un temporizador para comparar el valor predeterminado de 4 contra el uso de Environment.ProcessorCount para utilizar todos los hilos disponibles. En nuestro caso, estamos utilizando un ordenador con 32 procesadores lógicos, por lo que MaxParallelThreads se establecerá en 32.

:path=/static-assets/barcode/content-code-examples/how-to/set-max-parallel-thread-performance.cs
using IronBarCode;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;

// Set the max parallel threads to the number of processor cores
int maxParallelThreads = Environment.ProcessorCount;


var optionsFaster = new BarcodeReaderOptions
{
    // Set Max threads to the number of processor cores
    Multithreaded = true,
    MaxParallelThreads = maxParallelThreads,
    ExpectMultipleBarcodes = true,
};

// Start timing the process
var stopwatch = Stopwatch.StartNew();
// Dynamically get the "images" folder in the current directory
string folderPath = Path.Combine(Directory.GetCurrentDirectory(), "images");

// Check if directory exists to prevent crashes
if (!Directory.Exists(folderPath))
{
    Console.WriteLine($"Error: The directory '{folderPath}' does not exist.");
    return;
}

// Get all JPG files in the directory
var pdfFiles = Directory.GetFiles(folderPath, "*.jpg");

foreach (var file in pdfFiles)
{
    // Read the barcode
    var results = BarcodeReader.Read(file);

    if (results.Any())
    {
        Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}");
        foreach (var result in results)
        {
            Console.WriteLine($"  Value: {result.Value}, Type: {result.BarcodeType}");
            
        }
    }
}

stopwatch.Stop();

// Print number of images the barcode reader could decode
Console.WriteLine($" Max parallel threads of {maxParallelThreads} with {stopwatch.Elapsed.TotalSeconds:F2}s");
Imports IronBarCode
Imports System
Imports System.Diagnostics
Imports System.IO
Imports System.Linq

' Set the max parallel threads to the number of processor cores
Dim maxParallelThreads As Integer = Environment.ProcessorCount

Dim optionsFaster As New BarcodeReaderOptions With {
    .Multithreaded = True,
    .MaxParallelThreads = maxParallelThreads,
    .ExpectMultipleBarcodes = True
}

' Start timing the process
Dim stopwatch As Stopwatch = Stopwatch.StartNew()
' Dynamically get the "images" folder in the current directory
Dim folderPath As String = Path.Combine(Directory.GetCurrentDirectory(), "images")

' Check if directory exists to prevent crashes
If Not Directory.Exists(folderPath) Then
    Console.WriteLine($"Error: The directory '{folderPath}' does not exist.")
    Return
End If

' Get all JPG files in the directory
Dim pdfFiles As String() = Directory.GetFiles(folderPath, "*.jpg")

For Each file As String In pdfFiles
    ' Read the barcode
    Dim results = BarcodeReader.Read(file)

    If results.Any() Then
        Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}")
        For Each result In results
            Console.WriteLine($"  Value: {result.Value}, Type: {result.BarcodeType}")
        Next
    End If
Next

stopwatch.Stop()

' Print number of images the barcode reader could decode
Console.WriteLine($" Max parallel threads of {maxParallelThreads} with {stopwatch.Elapsed.TotalSeconds:F2}s")
$vbLabelText   $csharpLabel

Resultado

Tiempo de proceso con 4 hilos

Procesador 4

El tiempo de procesamiento para este proceso es de 84 segundos.

Tiempo de procesamiento con el entorno ProcessorCount

Procesador 32

Como puedes ver, el tiempo de procesamiento de esta operación es de 53 segundos, lo que es significativamente más rápido que ejecutarla con solo cuatro hilos. Sin embargo, tenga en cuenta que el uso de más hilos no garantiza un mejor rendimiento, ya que depende del procesador host. Una regla general es utilizar el número máximo de procesadores disponibles menos uno, asegurándose de que queda un único subproceso disponible para otras operaciones del sistema.

Advertencia El entorno del proyecto debe estar configurado para permitir el multi-threading. De lo contrario, establecer Multithreaded a true y aumentar MaxParallelThreads no mejorará la velocidad del proceso y puede incluso disminuirla.

Preguntas Frecuentes

¿Para qué sirve establecer el número máximo de hilos paralelos en IronBarcode?

La configuración del número máximo de subprocesos paralelos permite optimizar el rendimiento de la generación de códigos de barras mediante el uso eficiente de los recursos del sistema, especialmente cuando se procesa un gran número de códigos de barras de forma masiva.

¿Cómo puedo configurar el número máximo de hilos paralelos en IronBarcode?

Puede configurar el número máximo de subprocesos paralelos en IronBarcode utilizando el método apropiado en su código C# para establecer el número deseado de subprocesos para las tareas de generación de códigos de barras.

¿Por qué es importante optimizar el rendimiento de la creación masiva de códigos de barras?

La optimización del rendimiento para la creación masiva de códigos de barras garantiza que el proceso sea eficiente y rápido, reduciendo el tiempo y los recursos necesarios para generar un gran volumen de códigos de barras, lo que resulta esencial para aplicaciones con grandes exigencias de rendimiento.

¿Cuáles son las ventajas de utilizar el procesamiento paralelo en IronBarcode?

El procesamiento paralelo en IronBarcode permite generar códigos de barras más rápidamente utilizando varios núcleos de CPU, lo que mejora el rendimiento de la aplicación y reduce el tiempo de procesamiento para tareas de códigos de barras a gran escala.

¿Puede afectar negativamente al rendimiento configurar demasiados hilos paralelos?

Sí, configurar demasiados hilos paralelos puede provocar contención de recursos y una mayor sobrecarga, reduciendo potencialmente el rendimiento. Es importante encontrar una configuración equilibrada que se ajuste a las capacidades de tu sistema.

¿Qué consideraciones deben tenerse en cuenta a la hora de elegir el número de hilos paralelos?

Hay que tener en cuenta el número de núcleos de CPU disponibles, la carga de trabajo del sistema y la naturaleza de las tareas de generación de códigos de barras. Lo mejor es experimentar con diferentes ajustes para encontrar la configuración óptima.

¿Existe una configuración predeterminada para los hilos paralelos en IronBarcode?

IronBarcode puede tener una configuración predeterminada para hilos paralelos, pero se recomienda personalizar esta configuración en función de las necesidades específicas de su aplicación para lograr el mejor rendimiento.

¿Cómo gestiona IronBarcode los hilos de ejecución?

IronBarcode aprovecha las capacidades de threading de .NET para gestionar el procesamiento paralelo, permitiendo a los desarrolladores especificar el número de threads para optimizar el rendimiento de forma eficaz.

¿Puedo cambiar el número de hilos paralelos dinámicamente durante la ejecución?

Cambiar el número de hilos paralelos de forma dinámica durante la ejecución puede no ser recomendable, ya que puede dar lugar a incoherencias y afectar a la estabilidad del rendimiento. Es mejor establecer la configuración antes de iniciar el proceso de generación del código de barras.

¿Cuáles son algunos de los casos de uso más comunes para establecer el número máximo de subprocesos paralelos en la generación de códigos de barras?

Los casos de uso comunes incluyen aplicaciones que requieren la generación de códigos de barras a alta velocidad, como los sistemas de gestión de inventarios, los sistemas de puntos de venta al por menor y las aplicaciones logísticas en las que el procesamiento rápido de grandes volúmenes de códigos de barras es fundamental.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
¿Listo para empezar?
Nuget Descargas 2,070,733 | Versión: 2026.2 recién lanzado