Tengo algunos bloques de código, dentro de una función de algún objeto, que pueden correr en paralelo y acelerar las cosas para mí.procesamiento paralelo simple en perl
He intentado utilizar subs::parallel
de la siguiente manera (todo esto es en un cuerpo de una función):
my $is_a_done = parallelize {
# block a, do some work
return 1;
};
my $is_b_done = parallelize {
# block b, do some work
return 1;
};
my $is_c_done = parallelize {
# block c depends on a so let's wait (block)
if ($is_a_done) {
# do some work
};
return 1;
};
my $is_d_done = parallelize {
# block d, do some work
return 1;
};
if ($is_a_done && $is_b_done && $is_c_done && $is_d_done) {
# just wait for all to finish before the function returns
}
En primer lugar, observe que uso if
que esperar a que las discusiones para bloquear y esperar hilo anterior a terminar cuando sea necesario (una mejor idea? el if
es bastante feo ...).
En segundo lugar, me sale un error:
Thread already joined at /usr/local/share/perl/5.10.1/subs/parallel.pm line 259.
Perl exited with active threads:
1 running and unjoined
-1 finished and unjoined
3 running and detached
Interesante. El problema es que '$ is_a_done' se comprueba en dos subprocesos diferentes, que es un mal uso/advertencia documentado de' subs :: parallel': * No debe pasar a otro subproceso/subrutinas en paralelo valores devueltos anteriores de otras subrutinas paralelizadas sin leyendo sus valores. * Admito que no encontré la advertencia de estar muy * claramente * documentada en la versión 0.8 de 'subs :: parallel', sin embargo. – pilcrow