La idea del script es dado una lista de procesos procesarlos en paralelo en una cantidad de hilos determinados (en este ejemplo 4). La idea es que cada hilo grabe en una base de datos su inicio y su fin usando una única conexión abierta en el cuerpo principal.
El error que me está dando es (handles can't be shared between threads and your driver may need a CLONE method added)
Una idea de cómo resolverlo, probé con shared la variable de conexión y me dio "Invalid value for shared scalar"
Muchas Gracias
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use threads;
- use DBI;
- use POSIX qw(strftime);
- my (@thr, @flag_thr);
- my ($hilolibre, $maxhilos, $flag_hilo);
- my $CONECT_DB;
- my ($sth, @registro);
- my ($fechahora);
- my $ODBCMONITOR = "DBI:ODBC:BUE_01_SAS_Monitor";
- ## Genero Fecha y hora
- $fechahora = strftime('%Y-%m-%d %H:%M:%S', localtime(time));
- ## Conectar a la base de Monitoreo mediante ODBC
- $CONECT_DB = DBI->connect($ODBCMONITOR) ;
- ## Chequeo si se realizo correctamente la conexion
- if ($? != 0)
- {
- my $error_code = $CONECT_DB->err;
- $CONECT_DB->disconnect;
- print "\n$error_code\n";
- exit -1;
- }
- ## Proceso
- $maxhilos = 4;
- for (my $numeroproceso = 0; $numeroproceso <= 10; $numeroproceso ++)
- {
- $hilolibre = -1;
- $flag_hilo = 0;
- while ($flag_hilo == 0)
- {
- $hilolibre += 1;
- ## Controlo que no se ejecuten mas hilos de los parametrizados
- if ($hilolibre < $maxhilos)
- {
- ## Si el $flag_thr[$hilolibre] no existe el hilo esta libre para uso
- if (!defined($flag_thr[$hilolibre]))
- {
- $flag_hilo = 1
- }
- else
- {
- ## Si $thr[$hilolibre] existe y termino la ejecucion puedo usra el hilo
- my $isrun = $thr[$hilolibre]->is_joinable();
- if ( $flag_thr[$hilolibre] == 0 && $isrun)
- {
- my $aux = $thr[$hilolibre]->join();
- print "Hilo Finalizo $hilolibre\n";
- $flag_hilo = 1;
- $flag_thr[$hilolibre] = 1;
- }
- }
- }
- else
- {
- ## LLegue al maximo de hilo vuelo a buscar desde el inicio
- $hilolibre = -1;
- }
- }
- ## Creo el hilo y levanto el flag de en ejecucion
- $thr[$hilolibre] = threads->create(\&proceso, $hilolibre, $numeroproceso, $fechahora );
- $flag_thr[$hilolibre] = 0;
- }
- ## Paro hasta que terminen todo los hilos
- $hilolibre = 0;
- print "Veo si terminaron todos\n";
- while ($hilolibre < $maxhilos)
- {
- ## Controlo que no se ejecuten mas hilos de los parametrizados
- my $isrun = $thr[$hilolibre]->is_joinable();
- next if (!$isrun);
- my $aux = $thr[$hilolibre]->join()if ( $flag_thr[$hilolibre] == 0 );
- print "Hilo $hilolibre finalizado\n";
- $hilolibre ++;
- }
- ## Cierro conexion a la base
- $CONECT_DB->disconnect;
- exit 0;
- sub proceso
- {
- my @Param = @_;
- my $random_number = int(rand(10)) + 1;
- print "Empieza hilo Nro: $Param[0] Proceso:$Param[1] Tiempo: $random_number\n";
- ## Grabo en Logs Estado de inicio del proceso
- $sqlstm = "Insert into Logs values ($Param[0], $Param[1], $Param[2], 'Inicio')";
- $sth = $CONECT_DB->prepare($sqlstm);
- $sth->execute();
- ## Simulo tiempo de proceso
- sleep $random_number;
- ## Actualizo en log estado de finalizacion
- $sqlstm = "Update Logs set Estado = 'Finalizo' Where Proceso = $Param[1] and Fecha = $Param[2]";
- $sth = $CONECT_DB->prepare($sqlstm);
- $sth->execute();
- return $random_number;
- }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4