Skip to content

Commit a2731a4

Browse files
committed
#15 - php
1 parent f0183ba commit a2731a4

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed
+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?php
2+
3+
/**
4+
* Clase para manejar tareas asíncronas
5+
*/
6+
class TareaAsincrona {
7+
private $nombre;
8+
private $segundos;
9+
private $pid;
10+
11+
/**
12+
* Constructor de la clase
13+
* @param string $nombre Nombre de la tarea
14+
* @param int $segundos Duración de la tarea en segundos
15+
*/
16+
public function __construct($nombre, $segundos) {
17+
$this->nombre = $nombre;
18+
$this->segundos = $segundos;
19+
}
20+
21+
/**
22+
* Ejecuta la tarea de forma asíncrona
23+
* @return bool True si la tarea se inició correctamente
24+
*/
25+
public function ejecutar() {
26+
// Crear un proceso hijo
27+
$pid = pcntl_fork();
28+
29+
if ($pid == -1) {
30+
die("No se pudo crear el proceso hijo\n");
31+
} else if ($pid) {
32+
// Proceso padre
33+
$this->pid = $pid;
34+
return true;
35+
} else {
36+
// Proceso hijo
37+
echo "{$this->nombre} - Iniciando...\n";
38+
echo "{$this->nombre} - Durará {$this->segundos} segundos\n";
39+
sleep($this->segundos);
40+
echo "{$this->nombre} - Finalizada\n";
41+
exit(0);
42+
}
43+
}
44+
45+
/**
46+
* Espera a que la tarea termine
47+
*/
48+
public function esperar() {
49+
if ($this->pid) {
50+
pcntl_waitpid($this->pid, $status);
51+
}
52+
}
53+
}
54+
55+
/**
56+
* Demostración básica de una tarea asíncrona
57+
*/
58+
function demostracionBasica() {
59+
echo "=== Demostración Básica ===\n";
60+
$tarea = new TareaAsincrona("TareaEjemplo", 2);
61+
$tarea->ejecutar();
62+
$tarea->esperar();
63+
}
64+
65+
/**
66+
* Implementación de la dificultad extra
67+
*/
68+
function dificultadExtra() {
69+
echo "\n=== Dificultad Extra ===\n";
70+
71+
// Crear las tareas
72+
$tareaC = new TareaAsincrona("Tarea C", 3);
73+
$tareaB = new TareaAsincrona("Tarea B", 2);
74+
$tareaA = new TareaAsincrona("Tarea A", 1);
75+
$tareaD = new TareaAsincrona("Tarea D", 1);
76+
77+
// Ejecutar C, B y A en paralelo
78+
$tareaC->ejecutar();
79+
$tareaB->ejecutar();
80+
$tareaA->ejecutar();
81+
82+
// Esperar a que terminen C, B y A
83+
$tareaC->esperar();
84+
$tareaB->esperar();
85+
$tareaA->esperar();
86+
87+
// Ejecutar D después de que las otras hayan terminado
88+
$tareaD->ejecutar();
89+
$tareaD->esperar();
90+
}
91+
92+
// Función principal
93+
function main() {
94+
demostracionBasica();
95+
dificultadExtra();
96+
}
97+
98+
// Ejecutar el programa
99+
main();
100+
101+
?>

0 commit comments

Comments
 (0)