En aquest mòdul, explorarem la programació multifil en Perl. La programació multifil permet executar múltiples fils d'execució dins d'un mateix procés, aprofitant millor els recursos del sistema i millorant el rendiment de les aplicacions. Aprendrem com crear, gestionar i sincronitzar fils en Perl.
Continguts
- Introducció a la Programació Multifil
- Creació de Fils
- Comunicació entre Fils
- Sincronització de Fils
- Exercicis Pràctics
- Introducció a la Programació Multifil
La programació multifil permet que un programa executi múltiples tasques simultàniament. Això és especialment útil en aplicacions que requereixen molta E/S o que poden dividir-se en tasques independents.
Avantatges de la Programació Multifil
- Millor Rendiment: Permet aprofitar millor els recursos del sistema.
- Responsivitat: Millora la resposta de les aplicacions interactives.
- Eficàcia: Permet realitzar múltiples tasques alhora.
Desavantatges de la Programació Multifil
- Complexitat: La gestió de fils pot ser complexa.
- Condicions de Carrera: Problemes de sincronització poden causar errors difícils de detectar.
- Bloquejos: Els fils poden bloquejar-se mútuament si no es gestionen correctament.
- Creació de Fils
Per crear fils en Perl, utilitzarem el mòdul threads
. Aquest mòdul proporciona una interfície per crear i gestionar fils.
Exemple Bàsic de Creació de Fils
use strict; use warnings; use threads; # Subrutina que serà executada en un fil sub treball { my $id = shift; print "Fil $id en execució\n"; sleep(2); print "Fil $id finalitzat\n"; } # Crear fils my $fil1 = threads->create(\&treball, 1); my $fil2 = threads->create(\&treball, 2); # Esperar que els fils acabin $fil1->join(); $fil2->join(); print "Tots els fils han finalitzat\n";
Explicació del Codi
use threads;
: Carrega el mòdulthreads
.threads->create(\&treball, 1);
: Crea un nou fil que executa la subrutinatreball
amb l'argument1
.$fil1->join();
: Espera que el fil$fil1
acabi.
- Comunicació entre Fils
Els fils poden comunicar-se entre ells utilitzant variables compartides. El mòdul threads::shared
permet compartir variables entre fils.
Exemple de Comunicació entre Fils
use strict; use warnings; use threads; use threads::shared; my $compte :shared = 0; sub incrementar { for (1..1000) { $compte++; } } # Crear fils my @fils; for (1..10) { push @fils, threads->create(\&incrementar); } # Esperar que els fils acabin $_->join() for @fils; print "Valor final del compte: $compte\n";
Explicació del Codi
use threads::shared;
: Carrega el mòdulthreads::shared
.my $compte :shared = 0;
: Declara una variable compartida.$compte++;
: Incrementa la variable compartida.
- Sincronització de Fils
La sincronització és crucial per evitar condicions de carrera. El mòdul Thread::Semaphore
proporciona semàfors per gestionar l'accés a recursos compartits.
Exemple de Sincronització amb Semàfors
use strict; use warnings; use threads; use Thread::Semaphore; my $semafor = Thread::Semaphore->new(); sub treball { $semafor->down(); # Bloqueja el semàfor print "Fil en execució\n"; sleep(2); print "Fil finalitzat\n"; $semafor->up(); # Allibera el semàfor } # Crear fils my @fils; for (1..5) { push @fils, threads->create(\&treball); } # Esperar que els fils acabin $_->join() for @fils; print "Tots els fils han finalitzat\n";
Explicació del Codi
use Thread::Semaphore;
: Carrega el mòdulThread::Semaphore
.$semafor->down();
: Bloqueja el semàfor.$semafor->up();
: Allibera el semàfor.
- Exercicis Pràctics
Exercici 1: Creació de Fils
Crea un programa que creï 5 fils, cadascun dels quals imprimeixi el seu identificador i dormi durant 1 segon.
Solució
use strict; use warnings; use threads; sub treball { my $id = shift; print "Fil $id en execució\n"; sleep(1); print "Fil $id finalitzat\n"; } my @fils; for my $i (1..5) { push @fils, threads->create(\&treball, $i); } $_->join() for @fils; print "Tots els fils han finalitzat\n";
Exercici 2: Comunicació entre Fils
Modifica l'exemple de comunicació entre fils per utilitzar 20 fils que incrementin una variable compartida 500 vegades cadascun.
Solució
use strict; use warnings; use threads; use threads::shared; my $compte :shared = 0; sub incrementar { for (1..500) { $compte++; } } my @fils; for (1..20) { push @fils, threads->create(\&incrementar); } $_->join() for @fils; print "Valor final del compte: $compte\n";
Conclusió
En aquest mòdul, hem après els conceptes bàsics de la programació multifil en Perl, incloent la creació de fils, la comunicació entre fils i la sincronització de fils. La programació multifil pot millorar significativament el rendiment de les aplicacions, però també introdueix complexitat addicional. Amb pràctica i una comprensió sòlida dels conceptes, podràs aprofitar els avantatges de la programació multifil en els teus projectes Perl.
Curs de Programació en Perl
Mòdul 1: Introducció al Perl
Mòdul 2: Programació Bàsica en Perl
Mòdul 3: Treballant amb Dades
Mòdul 4: Programació Intermèdia en Perl
Mòdul 5: Programació Avançada en Perl
- Expressions Regulars Avançades
- Interacció amb Bases de Dades amb DBI
- Programació Web amb Perl
- Multifil