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 subrutinatreballamb l'argument1.$fil1->join();: Espera que el fil$fil1acabi.
- 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
