From amijaresp at gmail.com Sat Dec 7 12:32:19 2013 From: amijaresp at gmail.com (Alberto Mijares) Date: Sat, 7 Dec 2013 16:02:19 -0430 Subject: [caracas-pm] Hilos en Perl In-Reply-To: <1385495820.6063.14.camel@trillian.itverx.com.ve> References: <1385495820.6063.14.camel@trillian.itverx.com.ve> Message-ID: 2013/11/26 Ernesto Hern?ndez-Novich : > On Sat, 2013-11-02 at 00:32 -0430, Alberto Mijares wrote: > [...] >> Estoy jugando un poco, de manera did?ctica, con el m?dulo "threads" de >> Perl. Quer?a ver qu? tanto pod?a mejorar un script sencillo que tengo >> para redimencionar fotos. > > Como el trabajo para cambiar las dimensiones de cada foto es > independiente entre fotos y por tanto no necesitan estado mutable > compartido, pienso que en lugar de complicarte con hilos, > Parallel::ForkManager es m?s f?cil de comprender y usar. Gracias, Ernesto. Realmente muy f?cil y ?til. Si quieres, cuando tengas tiempo, podr?as explicar por aqu? c?mo identificar los casos en los que conviene usar hilos y cu?ndo es mejor lanzar nuevos procesos. Saludos Alberto Mijares From emhnemhn at gmail.com Tue Dec 24 07:01:47 2013 From: emhnemhn at gmail.com (Ernesto =?ISO-8859-1?Q?Hern=E1ndez-Novich?=) Date: Tue, 24 Dec 2013 10:31:47 -0430 Subject: [caracas-pm] Hilos en Perl In-Reply-To: References: <1385495820.6063.14.camel@trillian.itverx.com.ve> Message-ID: <1387897307.5633.58.camel@trillian.itverx.com.ve> On Sat, 2013-12-07 at 16:02 -0430, Alberto Mijares wrote: > 2013/11/26 Ernesto Hern?ndez-Novich : > > On Sat, 2013-11-02 at 00:32 -0430, Alberto Mijares wrote: > > [...] > >> Estoy jugando un poco, de manera did?ctica, con el m?dulo "threads" de > >> Perl. Quer?a ver qu? tanto pod?a mejorar un script sencillo que tengo > >> para redimencionar fotos. > > > > Como el trabajo para cambiar las dimensiones de cada foto es > > independiente entre fotos y por tanto no necesitan estado mutable > > compartido, pienso que en lugar de complicarte con hilos, > > Parallel::ForkManager es m?s f?cil de comprender y usar. > > > Gracias, Ernesto. Realmente muy f?cil y ?til. > > Si quieres, cuando tengas tiempo, podr?as explicar por aqu? c?mo > identificar los casos en los que conviene usar hilos y cu?ndo es mejor > lanzar nuevos procesos. Si las unidades de trabajo son independientes, en el sentido que no necesiten compartir datos, entonces usar hilos no es una buena idea. Esto es, si eres capaz de trocear un trabajo grande (digamos, procesar UNA bit?cora muy grande) en unidades independientes m?s o menos del mismo tama?o (de la l?nea 1 a la 100000, de la 100001 a la 200000, y as?) es mejor usar procesos independientes con fork() (Parallel::ForkManager). En tu ejemplo, la tarea de cambiar las dimensiones de una foto es absolutamente independiente de la tarea de cambiar las dimensiones de otro. Se trata de un caso ideal para Parallel::ForkManager: divide la cantidad de fotos entre la cantidad de n?cleos que vas a dedicar al proceso, genera un proceso para cada conjunto de fotos y que hagan su trabajo en paralelo. Si las unidades de trabajo tienen que compartir datos *mutables* entre si y el algoritmo es paralelizable, entonces en Perl (y otros lenguajes imperativos), no te queda m?s remedio que usar hilos, mutexes y entregarte al maravilloso mundo de las condiciones de carrera. No hay reglas autom?ticas para decidir por uno u otro, pero en lenguajes imperativos hay que hacer un esfuerzo por evitar los hilos y preferir procesos independientes, quiz?s con pasaje de mensajes, para evitar los problemas de lidiar con estado mutable concurrente. En lenguajes funcionales como Haskell o Erlang, es much?simo m?s f?cil escribir programas concurrentes usando hilos, porque es imposible tener estado mutable "vulnerable": en el caso de Erlang, porque tienes que pasar mensajes entre estados inmutables independientes; en el caso de Haskell, porque puedes usar Memoria Transaccional (STM) garantizada por el sistema de tipos. La primera t?cnica la puedes simular en Perl, usando el m?dulo Parallel::ForkManager y alg?n IPC inmutable (pipes, sockets). La segunda t?cnica no se puede simular *completamente* en un lenguaje imperativo moderno, y es poco probable que se logre porque el costo de implantaci?n y ejecuci?n es enorme por muchas razones t?cnicas. La programaci?n concurrente y paralela es mucho m?s pr?ctica y amena en lenguajes funcionales. -- Ernesto Hern?ndez-Novich - @iamemhn - Unix: Live free or die! Geek by nature, Linux by choice, Debian of course. If you can't aptitude it, it isn't useful or doesn't exist. GPG Key Fingerprint = 0064 ADF5 EB5C DE16 99C1 6C56 F2A3 86B5 A757 E5A1